我写代码时代码没有崩溃:
char s[44] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
memmove(s, "asdf", 5);
但我写的时候会这样做:
char* s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
memmove(s, "asdf", 5);
有谁知道为什么?
答案 0 :(得分:7)
第一个分配空间并将a放入
第二个是指向常量内存的指针,不允许更改它。
答案 1 :(得分:1)
在第一种情况下,在堆栈上分配44个字节,并将字符串“aa..a”复制到此空间。但是在第二个空格中,字符串“aa..a”是一个常量值并存储在只读数据段中。因此,当您尝试写入只读存储器地址时,将发生页面错误。
答案 2 :(得分:1)
char* s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
字符串常量“aaaa”无论存储在只读存储器中的是什么。例如,在elf可执行文件中,它们将存储在.rodata
部分中,该部分也是可写的。因此,当您尝试在这样的位置写入时,会导致错误
另一方面,char s[]
将字符串存储在本地堆栈区域中,您可以修改它。