在 c 中使用 free() 的分段错误
Segmentation Fault using free() in c
我试图用我拥有的一些 C 代码找出问题所在。调试器说当我尝试从指针释放内存时发生错误:
int main(int argc, char *argv[]){
char *desc = malloc(30 * sizeof(char));
if(desc == NULL)
{
fprintf(stderr, "Error - cannot allocate memory\n");
}
desc = "Debug this program.";
printf("Description: %s\n", desc);
free(desc);//break point here
int cpid = fork();
....
您重新分配了 desc
然后释放了一个指向字符串文字的指针,这是非法的并且会导致分段错误。
你显然没能理解 malloc()
的用途,malloc()
从 OS 请求内存和 returns 一个指向你可以在你的程序中使用的有效内存的指针程序。
在你malloc()
之后你可以使用内存,但并不是所有的指针都需要我malloc()
ed。例如,您可以拥有指向字符串文字的指针,它们也很有用。
但是您不能将任何内容传递给 free()
,除非它是由 malloc()
/calloc()
/realloc()
返回的。指向字符串文字或保存变量地址的指针不是这样的指针,将它传递给 free()
是未定义的行为。
仅在您知道必须这样做的情况下才使用 malloc()
,例如,分配大量会溢出堆栈的内存或分配可在运行时计算的未知内存量。否则不要。
您正在尝试释放文字字符串的地址,这是非法的。
要用您的文字字符串初始化一个 malloc
化的字符串,您可以使用,例如strcpy:
strcpy(desc, "Debug this program.");
您还应该 exit/terminate 您的程序以防 malloc
失败。
一开始你动态分配了内存并将它的地址分配给了指针desc
char *desc = malloc(30 * sizeof(char));
然后你用字符串文字的第一个字符的地址重新分配了指针"Debug this program."
desc = "Debug this program.";
因此分配的内存地址丢失了。
那么你正在尝试释放字符串文字占用的内存
free(desc);//break point here
然而,字符串文字具有静态存储持续时间,无法使用标准函数释放 free
。
代替这个赋值语句
desc = "Debug this program.";
你应该使用标准的 C 函数 strcpy
作为例子
strcpy( desc, "Debug this program." );
简单地说(并阅读其他解决方案),内存不属于您,无法删除。
我试图用我拥有的一些 C 代码找出问题所在。调试器说当我尝试从指针释放内存时发生错误:
int main(int argc, char *argv[]){
char *desc = malloc(30 * sizeof(char));
if(desc == NULL)
{
fprintf(stderr, "Error - cannot allocate memory\n");
}
desc = "Debug this program.";
printf("Description: %s\n", desc);
free(desc);//break point here
int cpid = fork();
....
您重新分配了 desc
然后释放了一个指向字符串文字的指针,这是非法的并且会导致分段错误。
你显然没能理解 malloc()
的用途,malloc()
从 OS 请求内存和 returns 一个指向你可以在你的程序中使用的有效内存的指针程序。
在你malloc()
之后你可以使用内存,但并不是所有的指针都需要我malloc()
ed。例如,您可以拥有指向字符串文字的指针,它们也很有用。
但是您不能将任何内容传递给 free()
,除非它是由 malloc()
/calloc()
/realloc()
返回的。指向字符串文字或保存变量地址的指针不是这样的指针,将它传递给 free()
是未定义的行为。
仅在您知道必须这样做的情况下才使用 malloc()
,例如,分配大量会溢出堆栈的内存或分配可在运行时计算的未知内存量。否则不要。
您正在尝试释放文字字符串的地址,这是非法的。
要用您的文字字符串初始化一个 malloc
化的字符串,您可以使用,例如strcpy:
strcpy(desc, "Debug this program.");
您还应该 exit/terminate 您的程序以防 malloc
失败。
一开始你动态分配了内存并将它的地址分配给了指针desc
char *desc = malloc(30 * sizeof(char));
然后你用字符串文字的第一个字符的地址重新分配了指针"Debug this program."
desc = "Debug this program.";
因此分配的内存地址丢失了。
那么你正在尝试释放字符串文字占用的内存
free(desc);//break point here
然而,字符串文字具有静态存储持续时间,无法使用标准函数释放 free
。
代替这个赋值语句
desc = "Debug this program.";
你应该使用标准的 C 函数 strcpy
作为例子
strcpy( desc, "Debug this program." );
简单地说(并阅读其他解决方案),内存不属于您,无法删除。