【问题标题】:Heap Corruption Detected: after Normal block检测到堆损坏:在正常块之后
【发布时间】:2013-10-12 18:33:08
【问题描述】:

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

【问题讨论】:

    标签: c visual-studio-2010


    【解决方案1】:

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

    将您的代码更改为以下应该可以解决它。

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

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

    【讨论】:

    • 谢谢您,先生,您拯救了我的一天。我将代码从 char 数组转换为 char 指针,并且错误地保留了数组的长度,该长度必须增加 1。+1 表示 +1(空终止符)单挑。
    • 得到同样的错误,因为乘法运算符的优先级被忽略并且“malloc(count + 1 * sizeof(char))”更改为“malloc((count + 1) * sizeof(char))”解决了,谢谢
    【解决方案2】:

    如果你这样做:

    char* v = malloc(n);
    

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

    几点说明:

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

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

    3. 如果没有其他方法,valgrind 可以帮助您找到此类错误。

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多