2015-11-10 3 views
1

Как обновить один char в строке, объявленной как char*?Обновление одного символа строки

Я попытался это:

int main(void) 
{ 
    char* s = "hello"; 
    s[0] = 'y'; 
    printf("%s\n", s); 
    return 0; 
} 

компилируется без предупреждений или ошибок с GCC 4.8.1 (MinGW) с использованием этих параметров:

gcc -Wall -Wextra -Werror -o str.exe str.c 

Но когда я запускаю приложение, это только печатает пустую строку?

+0

https://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/ – Xogle

+0

Измените 'char * s' на' const char * s', и компилятор будет предупреждать, стоит отметить что как бы то ни было, 's' указывает на строковый литерал, который по своей сути является' const'. –

+1

Причиной этого является 'char * s =" hello ";' создает * string-literal * в сегменте данных readonly. Попытка изменить данные только для чтения -> происходят плохие вещи. –

ответ

3

Что вы делаете, это попытка изменить строковый литерал. Это приводит к undefined behavior.

Похожие, от стандартной C11, глава §6.4.5, Строковые литералы

[..] Если программа пытается изменить такой массив, поведение не определено.

Вам нужно использовать массив char s, если вы хотите изменить его содержимое. Что-то вдоль линии

char s[] = "hello"; 

В противном случае, если вы хотите иметь char *s форму, вы должны

  1. Выделяем память для s
  2. Используйте strcpy(), чтобы скопировать содержимое в s

, а затем вы можете изменить s, так как ячейка памяти вернулась на malloc() будет доступен для записи.

+0

Справа. Объявите s следующим образом: char s [] = "hello"; – bruceg

+1

@bruceg на самом деле вы можете оставить размер. Компилятор будет соответствующим образом распределен. –

+0

Хорошая точка. Твой путь еще лучше. Я обновил свой предыдущий комментарий. – bruceg

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