C代码从memmove崩溃
当我编写以下代码时,我的代码不会崩溃:C代码从memmove崩溃,c,memmove,C,Memmove,当我编写以下代码时,我的代码不会崩溃: char s[44] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; memmove(s, "asdf", 5); char* s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; memmove(s, "asdf", 5); 但当我写下: char s[44] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
char s[44] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
memmove(s, "asdf", 5);
char* s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
memmove(s, "asdf", 5);
但当我写下:
char s[44] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
memmove(s, "asdf", 5);
char* s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
memmove(s, "asdf", 5);
有人知道为什么吗?第一个分配空间并将a放入
第二个是指向常量内存的指针,不允许更改它。在第一种情况下,堆栈上分配了44个字节,字符串aa..a复制到此空间。但在第二个空间中,字符串aa..a是一个常量,存储在只读数据段中。因此,当您尝试写入只读内存地址时,将出现页面错误。char*s=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 字符串常量aaaa表示存储在只读内存中的任何内容。例如,在elf可执行文件中,它们将存储在.rodata部分,该部分不可写。因此,当您试图在这样的位置写入时,会导致错误
另一方面,char s[]将字符串存储在本地堆栈区域中,您可以对其进行修改。您是否遇到分段错误?您是使用gcc编译的吗?请注意,试图修改字符串文字是未定义的行为。显然,在你的情况下,UB使你的程序崩溃;在另一台计算机中,它可能会更改字符串文本的内容;在另一台计算机上,它可能会使柠檬汁从USB端口渗出。@OliCharlesworth:是的,更具体地说,是UNIX中的SIGSEGV sigal