我遇到一个程序,我试图将字符串复制到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
答案 0 :(得分:25)
只有通过调用malloc()
,realloc()
或calloc()
返回的指针才能传递给free()
(堆上动态分配的内存)。来自 7.20.3.2 C99标准的自由功能:
free函数导致ptr指向的空间被释放,即被释放 可供进一步分配。如果ptr是空指针,则不执行任何操作。 否则,如果 参数与之前由calloc,malloc或realloc函数返回的指针不匹配,或者如果通过调用free或realloc释放了空间, 行为未定义。
在发布的代码中,str
不是动态分配的,而是在堆栈上分配,并在超出范围时自动释放,并且不需要free()
d。
答案 1 :(得分:10)
小心点。这段代码显示了两件事的混淆:
strcpy
第1点
这已经在某种程度上得到了解答,但我会稍微扩展一下:
堆是为您的进程提供动态内存的地方。当您调用malloc
(和相关函数)时,将在堆上返回内存。完成后你必须free
这段记忆。
堆栈是进程运行状态的一部分。它是存储普通变量的地方。当你调用一个函数时,它的变量被压入堆栈并在函数退出时自动弹回。您的str
变量是堆栈中某些内容的示例。
第2点
我想知道矩阵数组的c
成员是什么。如果它是一个指针,那么你可能会对strcpy
的作用感到困惑。该函数仅将字符串的字节从内存的一部分复制到另一部分。所以记忆必须可用。
如果c
是一个char
数组(有足够数量的元素来保存字符串),这没关系。但是如果c
是指针,那么如果你想使用strcpy
,必须已经为它分配了内存。还有一个替代函数strdup
,它为字符串分配足够的内存,复制它并返回指针。当你不再需要时,你负责free
指针。
答案 2 :(得分:3)
它使用free
而不使用malloc
。您无法释放尚未分配的内存。
答案 3 :(得分:1)
您的代码不会为字符串分配任何内存。它只是将一个字符串从一个字符串复制到另一个字符串使用的内存(一串空格)。
使用malloc()
,realloc()
等函数分配内存,然后使用free()
释放。由于此内存未以这种方式分配,因此将地址传递给free()
会导致错误。
答案 4 :(得分:1)
您没有使用malloc()
在堆中为str
分配空间。因此,str
在堆栈上分配,不能用free()
解除分配,但在str
超出范围时,即在包含声明的函数返回后将被释放。