-1

我的代码在编写时不会崩溃:

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

但是当我写的时候它确实如此:

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

有谁知道为什么?

4

3 回答 3

7

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

第二个是指向常量内存的指针,你不能改变它。

于 2012-03-16T10:14:34.437 回答
1

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

于 2012-03-16T10:15:59.060 回答
1

char* s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

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

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

于 2012-03-16T11:08:33.557 回答