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";
此代码有效时:
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";