Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用字符串调用free()会导致***glibc检测到***错误_C_Memory Management - Fatal编程技术网

使用字符串调用free()会导致***glibc检测到***错误

使用字符串调用free()会导致***glibc检测到***错误,c,memory-management,C,Memory Management,守则: #include <stdio.h> #include <stdlib.h> int main() { char * cp = malloc(sizeof * cp * 20); cp="Hello\0"; free(cp); return 0; } 我认为在释放指针之前,它已经被破坏了,但我不知道如何。对它不做任何处理,在mallocing之后立即释放它效果很好,所以我认为我把字符串值放错了 对不起,我是个新手。非常感谢您的帮助

守则:

#include <stdio.h>
#include <stdlib.h>

int main()
{
   char * cp = malloc(sizeof * cp * 20);
   cp="Hello\0";
   free(cp);

    return 0;
}
我认为在释放指针之前,它已经被破坏了,但我不知道如何。对它不做任何处理,在mallocing之后立即释放它效果很好,所以我认为我把字符串值放错了

对不起,我是个新手。非常感谢您的帮助


哦,我不知道为什么标准C++库被包含在这个错误中,但这不是问题。我试着手动编译它为gcc,但得到了相同的错误,减去libstdc++。代码::Blocks太愚蠢了。

您已经用指向只读数据的指针覆盖了malloced指针。您需要使用strncpy()

另外,您的malloc参数应该是sizeof(char)*20

cp="Hello\0";
您正在分配一个指向cp的指针,该指针不是来自malloc,因此发生了崩溃

char * cp = malloc(sizeof * cp * 20);
这里
cp
被声明为
char*
并初始化为指向动态分配的20个
char
数组

cp="Hello\0";
现在,将
cp
指定为指向一个固定字符串,将丢失先前的
cp
值。这就是导致内存泄漏的原因

free(cp);

现在,它试图
释放固定字符串,但这是非法的。您只能
释放
malloc
(或
calloc
realloc
)分配的
内存。

顺便说一句:您不需要将字符串写为“Hello\0”。每当您编写字符串文字时,都会在末尾自动添加一个“\0”。
sizeof*cp*20
至少在面对
cp
类型的更改时更加健壮;显式使用
sizeof(char)
时没有指针。切勿写入
sizeof(char)
。OP编写
1
sizeof*cp
)的方式有些有用,但
sizeof(char)
从来没有用过@查尔斯:糟糕的双关语…+1@super_ness:用strcpy()来表示
free(cp);