为什么我不能释放malloc的字符串?

ant*_*nio 2 c string malloc free constants

我有这个代码:

#define ABC "abc"

void main()
{
char *s = malloc(sizeof(char)*3);
printf("%p ", s);
s = ABC;
printf("%p ", s);
free(s);
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

0x8927008 0x8048574 Segmentation fault (core dumped)

正如您所看到的,字符串s的地址在赋值后会发生变化(我认为这就是free()给出segfault的原因).谁能解释我为什么以及如何发生这种情况?谢谢!

sim*_*onc 8

这条线

s = ABC;
Run Code Online (Sandbox Code Playgroud)

更改s为指向可能位于只读内存中的其他字符串.尝试释放此类内存会导致未定义的行为.可能会崩溃.

我想你想要的

strcpy(s, ABC);
Run Code Online (Sandbox Code Playgroud)

代替.这会将char数组"abc"复制到s.请注意,这将导致进一步的错误 - s太短,并且在末尾没有空间用于nul终止符ABC.将分配更改为4个字节以解决此问题

char *s = malloc(4);
Run Code Online (Sandbox Code Playgroud)

或使用

char *s = malloc(sizeof(ABC));
Run Code Online (Sandbox Code Playgroud)

if ABC是您要存储的最大长度.