使用字符串调用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)*20cp="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);