检测到堆腐蚀:正常阻塞后

use*_*179 3 c visual-studio-2010

"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);
 }
Run Code Online (Sandbox Code Playgroud)

tin*_*man 7

您正在分配一个字节太短的内存.您的计算是针对例如"主题:"和"内容:"之间的数据长度,但不考虑字符串中对空终止符的需要.然后,当您手动添加空终止符时,您将通过写入数组末尾来调用未定义的行为.

将代码更改为以下内容应该可以解决问题.

char* messageSubject = malloc(cPtr - sPtr - strlen("Subject:") + 1)
char* messageContent = malloc(strlen(cPtr + strlen("Content:")) + 1)
Run Code Online (Sandbox Code Playgroud)

您也不会在"..."部分显示代码,因此您可能在其中有一个未终止的字符串,如果它正在由字符串库例程处理,则可能会导致问题.