1

虽然此代码有效:

 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”)

谢谢你。

4

3 回答 3

1

像这样的声明

char *k = "asd";

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

如果您希望字符串内容可修改,则需要使用数组,例如

char k[] = "asd";
于 2015-03-19T15:04:48.873 回答
0

该声明

memmove(k,k+1,3);  

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

于 2015-03-19T15:03:13.273 回答
0

当你这样做char *k = "asd"时,字符串"asd"被放置在内存的只读部分中,并且指针 k 指向那里。您无法使用 写入此位置memmove()

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

于 2015-03-19T15:04:07.233 回答