2015-03-19 4 views
1

в то время как этот код работает:Memmove в то же указатель на удаление нескольких пробельные 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" 

Я имею в виду, не так? Почему это дает erorr? Я планирую использовать его для удаления нескольких пробелов («aaa ....... bbb» (точки являются пробелами) -> «aaa bbb»)

Спасибо.

+0

Приведенный выше код является фиктивным и работает только на удачу. Вы не копируете завершающий '\ 0'. Поэтому строка j не имеет завершающего '\ 0'. Во втором коде вы изменяете глобальную константу «asd», которая является плохим. – chmike

ответ

1

Декларация как

char *k = "asd"; 

вызывает строковый литерал хранится в сегменте данных только для чтения. (Компиляторы C обычно не предупреждают об этом случае, хотя объявление указателя как const char *k = "asd" было бы более безопасным по историческим причинам.)

Если вы хотите, чтобы содержимое строки было модифицируемым, вам нужно будет использовать массив, например

char k[] = "asd"; 
0

Заявление

memmove(k,k+1,3); 

пытается переложить элементы строкового литерала asd по 1. Строковые литералы не изменяются. Любая попытка изменить его вызовет неопределенное поведение.

0

Когда вы делаете char *k = "asd", строка "asd" помещается в считанные части памяти и указывается указатель k. Вы не можете писать в это место, используя memmove().

Вместо этого вы должны использовать char k[] = "asd".

Смежные вопросы