首页 > 解决方案 > 为什么在 C 中的这个 realloc 命令之后 valgrind 输出无效读取?

问题描述

我的 C 程序从终端读取一个字符串并对其进行更改,如下所示:

//in int main
size_t n = 0;  char *inp = NULL;
while (getline (&inp, &n, stdin) != -1) {
   editStr("text", inp);
   fputs(inp, stdout);
   free(inp);
   n = 0;
   inp = NULL;
}



void editStr(char *add, char *inp){
  int newLength = strlen(inp) + strlen(add);
  char *p=malloc(newLength + 1);
  int addIndex = 0;
  for(int i = 0; i < newLength; i++){
    if(addIndex < strlen(add){
       p[i]=add[i];
       addIndex++;
    }
    else{
      p[i]=inp[i-addIndex];
    }
  }
  p[newLength] = '\0';
  inp = realloc(inp, newLength+1);
  strcpy(inp, p);
  free(p);
}

在类似的东西上运行这个之后

echo aabaac | valgrind -q --track-origins=yes ./program

这可以正常工作,但 valgrind 会输出大量错误。

==6749== Invalid read of size 1
==6749==    at 0x483BBE6: strlen (vg_replace_strmem.c:461)
==6749==    by 0x48F7CF8: fputs (iofputs.c:33)
==6749==    by 0x40133F: main (program.c:72)

我在内存方面做错了什么?我正确释放了 p 并且行已更新。

标签: cmemory-managementrealloc

解决方案


推荐阅读