Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C代码从memmove崩溃_C_Memmove - Fatal编程技术网

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