我有一个程序的问题,我试图将字符串复制到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
小心.这段代码显示了两件事的混乱:
strcpy第1点
这已经在某种程度上得到了回答,但我会稍微扩展一下:
该堆就是动态内存是给你的进程.当您调用malloc(和相关函数)时,将在堆上返回内存.完成后你必须记住free这个记忆.
该堆栈是你的进程运行状态的一部分.它是存储普通变量的地方.当你调用一个函数时,它的变量被压入堆栈并在函数退出时自动弹回.您的str变量是堆栈中的某个示例.
第2点
我想知道c你的矩阵阵列的成员是什么.如果它是一个指针,那么你可能会对这是什么感到困惑strcpy.该函数仅将字符串的字节从内存的一部分复制到另一部分.所以内存必须可用.
如果c是一个char数组(具有足够数量的元素来保存字符串),这是可以的.但是如果c是指针,那么如果你想使用它,你必须已经为它分配了内存strcpy.还有一个替代函数strdup,它为字符串分配足够的内存,复制它并返回指针.free当您不再需要时,您负责指针.
| 归档时间: |
|
| 查看次数: |
51975 次 |
| 最近记录: |