Memmove in same pointer for delete multiple whitespaces C

Memmove in same pointer for deleting multiple whitespaces C

此代码有效时:

 char * k = "asd"; 
 char * j = malloc(sizeof(char) * 3);
 memmove(j,k,3);
 printf("%s",j);

而代码给出错误:

 char * k = "asd";
 char * j = malloc(sizeof(char) * 3);
 memmove(k,k+1,3);
 printf("%s",k); // output should be "sd"

我想错了?为什么会报错?我打算用它来删除多个空格 ("aaa.......bbb"(点是空格) -> "aaa bbb")

谢谢。

声明

memmove(k,k+1,3);  

尝试将字符串文字 asd 的元素移动 1。字符串文字是不可修改的。任何修改它的尝试都会引发未定义的行为。

当你执行char *k = "asd"时,字符串"asd"被放置在内存的只读部分,指针k指向那里。您不能使用 memmove().

写入此位置

您应该改用 char k[] = "asd"

这样的声明
char *k = "asd";

导致字符串文字存储在只读数据段中。 (C 编译器往往不会针对这种情况发出警告,即使将指针声明为 const char *k = "asd" 会更安全,出于历史原因。)

如果你希望字符串内容可以修改,你需要使用数组来代替,比如

char k[] = "asd";