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

时间:2012-10-30 21:52:36

标签: 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

5 个答案:

答案 0 :(得分:25)

只有通过调用malloc()realloc()calloc()返回的指针才能传递给free()(堆上动态分配的内存)。来自 7.20.3.2 C99标准的自由功能

  

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

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

答案 1 :(得分:10)

小心点。这段代码显示了两件事的混淆:

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

    第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超出范围时,即在包含声明的函数返回后将被释放。