21

我在尝试将字符串复制到 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
4

5 回答 5

34

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

free 函数会导致 ptr 指向的空间被释放,也就是说,可用于进一步分配。如果 ptr 是空指针,则不会发生任何操作。否则,如果参数与 calloc、malloc 或 realloc 函数先前返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 被释放,则行为未定义。

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

于 2012-10-30T21:54:05.070 回答
11

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

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

第 1 点

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

是为您的进程提供动态内存的地方。当您调用malloc(和相关函数)时,内存会在堆上返回。当你完成它时,你必须free拥有这个记忆。

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

第 2 点

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

如果c是一个char数组(有足够数量的元素来保存字符串),这没关系。但是如果c是一个指针,如果你想使用它,你必须已经为它分配了内存strcpy。有一个替代函数strdup可以为字符串分配足够的内存,复制它,然后返回一个指针。free当您不再需要该指针时,您有责任处理该指针。

于 2012-10-30T22:04:27.270 回答
3

它使用free而不使用malloc. 您无法释放尚未分配的内存。

于 2012-10-30T22:35:38.260 回答
1

您的代码没有为字符串分配任何内存。它只是将一个字符串从一个字符串复制到另一个字符串使用的内存(一串空格)。

malloc()使用,等函数分配内存realloc(),然后使用free(). 由于该内存不是以这种方式分配的,因此将地址传递给会free()导致错误。

于 2012-10-30T21:56:53.427 回答
1

您没有使用malloc()在堆中为str. 因此,str在堆栈上分配,不能用 释放free(),但会在str超出范围时释放,即在包含声明的函数返回之后。

于 2012-10-30T21:58:18.620 回答