LINUX.ORG.RU

Как вы объяляете константные строки в C?


0

1
const char *str="Hello world";
const char str[]="Hello world";

или еще как?

Кстати, разница между этими 2-мя вариантами есть?

Насколько я знаю, во втором случае место под строку выделяется на стеке. Или я не прав? А в первом случае где?

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 2)

Насколько я знаю, во втором случае место под строку выделяется на стеке. Или я не прав? А в первом случае где?

Это внутри функции? Если да, то в первом случае строка хранится в .rodata.

hateyoufeel ★★★★★
()
Ответ на: комментарий от cvs-255
gcc -O2 test.c -o test
objdump -sS ./test

Храним строку «Hello world» в .rodata для глобальных - всегда.
Для стековой const char str[]=«Hello world»; храним в .text, при выполнении копируется в стек.

const char str[] - массив константных символов, str - константный указатель на первый элемент массива.

const char *str - неконстантный указатель на символ.

Для стекового const char str[] защита от записи в элементы массива будет только на этапе компиляции.

ihanick
()

Если там const, то семантически разницы нет

buddhist ★★★★★
()

Строка всегда выделяется в секции данных, иначе откуда её брать для стека. В первом случае ещё выделяется место для указателя.

Harald ★★★★★
()

Первый вариант объявляет переменную str, содержащую указатель на константную строку.

Второй вариант эквивалентен

const char *const str="Hello world";

annulen ★★★★★
()

Кстати, разница между этими 2-мя вариантами есть?

Есть, возьми sizeof от каждой

yoghurt ★★★★★
()

Эх, опередили. Хотел спросить не писали ли тут про sizeof.

во втором случае

и там и там место выделяется в .rodata

nanoolinux ★★★★
()

Самый эффективный вариант:

static const char str[] = "Hello world";

cord
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.