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