4

“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);
 }
4

2 回答 2

13

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

将您的代码更改为以下内容应该可以修复它。

char* messageSubject = malloc(cPtr - sPtr - strlen("Subject:") + 1)
char* messageContent = malloc(strlen(cPtr + strlen("Content:")) + 1)

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

于 2013-10-05T23:16:28.757 回答
0

如果你这样做:

char* v = malloc(n);

那么 v 的有效下标范围从v[0]v[n-1]。特别是,v[n] 永远不会有效。这是一般规则。如果您再次查看您的代码,您应该会发现问题所在。

几点注意事项:

  1. 您的代码假定主题:在内容之前:并且它们都存在。这种假设在某些情况下是不正确的。您应该在开始 malloc'ing 大量内存之前进行检查(因为小的负数会变成巨大的无符号正数)。您还应该确保您的 malloc 不会返回 0,而不是在返回 0 时出现段错误。

  2. strdup(and strndup) 通常会让你免于尴尬的“哎呀,我没有为 NUL 字节分配足够的空间”错误。它们也不需要太多的麻烦,使您的代码更简单、更可靠、更容易理解。了解他们。他们将成为你的朋友。

  3. 如果没有其他工作,valgrind可以帮助您找到这样的错误。

于 2013-10-05T23:15:44.223 回答