C代码从memmove崩溃

时间:2012-03-16 10:12:29

标签: c memmove

我写代码时代码没有崩溃:

char s[44] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
memmove(s, "asdf", 5);

但我写的时候会这样做:

char* s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
memmove(s, "asdf", 5);

有谁知道为什么?

3 个答案:

答案 0 :(得分:7)

第一个分配空间并将a放入

第二个是指向常量内存的指针,不允许更改它。

答案 1 :(得分:1)

在第一种情况下,在堆栈上分配44个字节,并将字符串“aa..a”复制到此空间。但是在第二个空格中,字符串“aa..a”是一个常量值并存储在只读数据段中。因此,当您尝试写入只读存储器地址时,将发生页面错误。

答案 2 :(得分:1)

char* s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

字符串常量“aaaa”无论存储在只读存储器中的是什么。例如,在elf可执行文件中,它们将存储在.rodata部分中,该部分也是可写的。因此,当您尝试在这样的位置写入时,会导致错误

另一方面,char s[]将字符串存储在本地堆栈区域中,您可以修改它。