“CRT 检测到应用程序写入到堆缓冲区的内存末尾”错误。当它到达 free
时崩溃。任何帮助表示赞赏。
int messageFunction(char* message) {
char* sPtr = strstr(message,"Subject:");
char* cPtr = strstr(message,"Content:");
char* messageSubject = (char*) malloc(cPtr - sPtr - strlen("Subject:"))
char* messageContent = (char*) malloc(strlen(cPtr + strlen("Content:")))
strncpy(messageSubject,
stPtr + strlen("Subject:"),
cPtr - sPtr - strlen("Subject:"));
messageSubject[cPtr - sPtr - strlen("Subject:")] = '\0';
strncpy(messageContent,
cPtr + strlen("Content:"),
strlen(cPtr + strlen("Content:")));
...
free(messageSubject);
free(messageContent);
}
void main() {
char* message = "Subject:HelloWorldContent:MessageContent";
int result = messageFunction(message);
}
最佳答案
您正在分配一个字节太短的内存。您的计算是针对例如之间的数据长度。 "Subject:"和 "Content:"但没有考虑到字符串中需要一个空终止符。然后,当您手动添加空终止符时,您会通过写入数组末尾来调用未定义的行为。
将您的代码更改为以下内容应该可以解决它。
char* messageSubject = malloc(cPtr - sPtr - strlen("Subject:") + 1)
char* messageContent = malloc(strlen(cPtr + strlen("Content:")) + 1)
您也没有在“...”部分显示代码,因此您可能在那里有一个未终止的字符串,如果字符串库例程正在处理它可能会导致问题。
关于c - 检测到堆损坏 : after Normal block,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19203604/