В какой области памяти программы, написанной на C, хранятся строковые литералы во время ее исполнения?
Хочу понять, почему не могу объявить литерал в переменной, вот так:
char s = "some_text";
приходится делать это с помощью указателя:
char *s = "smth";
Может ли это быть связанно с тем, что такие литералы хранятся в стеке или куче?
Я знаю что литералы хранятся в смежных ячейках памяти (т.е., в соседних), а где хранятся эти смежные ячейки?
Ответы (3 шт):
Это связано с тем, что в объявлении
char s = "some_text";
вы выделяете ровно 1 (прописью: один) байт для хранения всего текста. Что, очевидно, не работает...
char s = 's';
вполне работоспособно...
Строки программы имеют тип массива букв char [ ] и они хранятся в коде программы, которая защищена от изменения.
Поэтому ваша запись
char *s = "smth";
создаёт переменную с типом указателя на первую букву константной строки и чтобы не было удивления от ошибок краха памяти надо объявлять её так :
char const * s = "smth" ;
s [ i ] - там буква с типом char const
или указателем на сам массив :
char const ( * p ) [ ] = ( char const ( * ) [ ] ) & "smth" ;
( * p ) [ i ] - там буква с типом char const
и чтобы была возможность изменять данную строку нужно создавать её копию так :
char s [ ] = "smth" ;
s [ 0 ] = 'S' ; - новую строку можно менять, заменяя буквы
или
char st [ 60 ] ;
strncpy ( st , "smth" , 59 ) ;
st [ 59 ] = '\00' ;
строки хранятся на стеке, можно выделить память под строку через malloc, тогда она будет в куче (heap). Вы же пихаете строку (массив) в один байт (char), что невозможно. Если же идёте через указатель, то размещаете один символ по адресу указателя.