"被释放的指针未分配"是什么意思?

pat*_*ues 16 c

我有一个程序的问题,我试图将字符串复制到c中的结构字符串变量.复制字符串后我试图释放临时字符串变量,该变量被复制到structs字符串变量.但是当我试图释放字符串时,程序打开了我并说"被释放的指针没有被分配".我不明白到底发生了什么.

char str[]="       ";           //temporary string to copy to structs string
str[3]=s;                       //putting a char s in middle
strcpy(matrix[i-1][j].c, str);  //copying the string
free(str);                      //freeing str that now is useless when copied
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 27

只有通过调用返回的指针malloc(),realloc()或者calloc()可以传递给free()(在堆上动态分配的内存).从第7.20.3.2开始,C99标准的自由功能:

free函数导致ptr指向的空间被释放,即可用于进一步分配.如果ptr是空指针,则不执行任何操作.否则,如果参数与之前由calloc,malloc或realloc函数返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则行为未定义.

在发布的代码中,str不是动态分配的,而是在堆栈上分配,并在超出范围时自动释放,不需要为free()d.


pad*_*ddy 10

小心.这段代码显示了两件事的混乱:

  1. 堆栈和堆内存之间的区别
  2. 的运作 strcpy

第1点

这已经在某种程度上得到了回答,但我会稍微扩展一下:

就是动态内存是给你的进程.当您调用malloc(和相关函数)时,将在堆上返回内存.完成后你必须记住free这个记忆.

堆栈是你的进程运行状态的一部分.它是存储普通变量的地方.当你调用一个函数时,它的变量被压入堆栈并在函数退出时自动弹回.您的str变量是堆栈中的某个示例.

第2点

我想知道c你的矩阵阵列的成员是什么.如果它是一个指针,那么你可能会对这是什么感到困惑strcpy.该函数仅将字符串的字节从内存的一部分复制到另一部分.所以内存必须可用.

如果c是一个char数组(具有足够数量的元素来保存字符串),这是可以的.但是如果c是指针,那么如果你想使用它,你必须已经为它分配了内存strcpy.还有一个替代函数strdup,它为字符串分配足够的内存,复制它并返回指针.free当您不再需要时,您负责指针.