【问题标题】:c realloc - memory not allocated as i set itc realloc - 我设置时未分配内存
【发布时间】:2018-03-20 01:03:09
【问题描述】:

我构建了一个函数,它将删除我写的文本中的一个单词,该函数有效,

但由于某种原因,内存比我分配的要多,所以在我完成后打印没有单词但带有符号和乱码的新字符串。

请帮助我了解为什么以及如何解决它,谢谢。

当我使用这个调试内存变化时:

newStr[k] = str[i];



char * newText(char * word, char *str)
{
 int count = 0, indexS = -1,indexE = -1;
 char *newStr = (char*)calloc(1,sizeof(char));
 int w = 0, k = 0,i,i2;
 if(strlen(word) > strlen(str))
     printf("Error: the word dosent exist");
 else
 {
     for (i = 0; i < strlen(str); i++)
     {
         if (str[i] != word[w])
         {
             newStr[k] = str[i];
             k++;
             newStr = realloc(newStr, k + 1);
         }
         else
         {
             i2 = i;
             while (str[i2] != ' ' && str[i2] != '\0')
             {
                 if (str[i2] == word[w])
                 {
                     count++;
                     w++;
                     i2++;
                 }
                 else
                 {
                     count = -1;
                     break;
                 }

             }
             if (strlen(word) == count)
             {
                 i = i2;
                 if (str != '\0') i++; // space
             }
             else
             {
                 newStr[k] = str[i];
                 k++;
                 newStr = realloc(newStr, k + 1);
             }
             count = 0;
             w = 0;
         }
    }
 }
 str[k] = '\0';
 return newStr;
}

【问题讨论】:

  • 你忘了空终止 newStr。
  • 在调用任何堆分配函数时:(malloc, calloc, realloc) 1) 始终检查 (!=NULL) 以确保操作成功。 2) 返回的类型是void*,因此可以分配给任何指针。强制转换只会使代码混乱,使其更难以理解、调试等。 3) 在调用realloc() 时,在检查 (!=NULL) 以确保操作成功之前,不要将返回的指针分配给目标变量。否则会丢失原来的指针,导致内存泄漏
  • 关于:if (str[i] != word[w]) 这没有正确比较。建议使用函数:strstr() 在字符串中查找任何匹配的单词。建议第一个操作是通过初始 malloc() strcpy() 将整个字符串复制到 newstr 中,使用 strstr() 查找与 word 匹配的任何字符序列,如果找到,移动字符(在 @987654330 结尾之后@) 覆盖找到word 的位置。使用适当的参数调用memmove() 会使事情变得简单。确保始终 NUL 终止 newstr 内容
  • 编译时,始终启用警告,然后修复这些警告。 (对于gcc,至少使用:-Wall -Wextra -Wconversion -pedantic -std=gnu11

标签: c allocation realloc


【解决方案1】:

您在返回之前将'\0' 字符附加到错误的字符串末尾:

str[k] = '\0';

制作:

newStr[k] = '\0';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2016-07-04
    • 2020-05-01
    • 1970-01-01
    • 2015-03-22
    • 2016-11-16
    相关资源
    最近更新 更多