Как работает эта строка кода? - PullRequest
4 голосов
/ 10 декабря 2011

Итак, я недавно просматривал чей-то код и увидел, что компилятор не жаловался и не было никаких ошибок времени выполнения со следующим:

const char *p = "I didn't malloc...";

Приведенный выше код работает, но мне было интересно, как,Вот что я думаю, что происходит.Кто-нибудь может подтвердить это, пожалуйста?

Таким образом, «я не malloc ...» статически выделяется в стеке во время компиляции, и адрес к этому передается указателю p.Аналогично тому, как распределяются статические массивы.Я в этом уверен на 90%, но некоторые подтверждения помогут.

Спасибо.

Ответы [ 5 ]

8 голосов
/ 10 декабря 2011

У вас есть строковый литерал "I didn't malloc...", расположенный где-то в постоянной памяти (именно там, где определяется реализация), на который указывает указатель p.

Важно отметить, что любая попытка изменить этот строковый литерал приведет к Неопределенное поведение .

На самом деле в C ++ объявить строковый литерал не рекомендуется, как вы.
Таким образом, в C ++ вы должны использовать const квалификатор, например:

const char *p = "I didn't malloc...";
7 голосов
/ 10 декабря 2011

Это строковый литерал. Стандарт не знает о «стеке», «кучах» и т. Д. - это детали реализации. Так что нет «стандартного» местоположения.

Но обычно его нет в стеке . Он находится в области только для чтения и называется text. И это не " похоже на то, как распределяются статические массивы ".

5 голосов
/ 10 декабря 2011

Память также выделяется только для чтения. Любая попытка изменить * p не определена.
Хотя обычно не в стеке, он будет частью сегмента данных исполняемого файла

2 голосов
/ 10 декабря 2011

p будет указывать на область памяти, доступную только для чтения, которая будет выделена в стеке. Более того, компилятор автоматически завершит строку нулем, добавив в конце байт '\ 0'.

Использование const опасно, фактически компилятор g ++ выдает предупреждение для следующего кода:

#include <stdio.h>

int main(int argc, const char *argv[])
{
    char *p = "AString8";
    printf("%s\n", p);
    printf("Last char: %c hex: %x\n", p[7], p[7]);
    printf("Last char + 1: %c hex: %x\n", p[8], p[8]);
    return 0;
}

предупреждение: устаревшее преобразование из строковой константы в 'char * ’

Вывод программы:

Last char: 8 hex: 38

Last char + 1:  hex: 0
2 голосов
/ 10 декабря 2011

Строковый литерал "I didn't malloc..." хранится в области только для чтения сегмента данных, а p содержит адрес этого местоположения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...