Как строковые литералы компилируются в C? - PullRequest
3 голосов
/ 13 июля 2011

Как строковые литералы компилируются в C?Насколько я понимаю, в test1 строка "hello" помещается компилятором в сегмент данных, а во 2-й строке p назначается этот жестко закодированный виртуальный адрес.Это правильно?и что нет принципиальной разницы между тем, как работает test1 и как работает test2.

Некоторый код:

#include <stdio.h>

test1();
test2();
test3();

main()
{
    test1();
    test2();
    //test3();
}

test1()
{
    char *p;
    p="hello";
}

test2()
{
    char *p="hello";
}

test3()
{
    char *p;
    strcpy(p,"hello");
}

любая ссылка из стандарта C будет принята с благодарностью, так что я могу понять этовещь в глубине с точки зрения компилятора.

Ответы [ 2 ]

4 голосов
/ 13 июля 2011

С точки зрения стандарта C нет особого требования в отношении того, где будет размещена литеральная строка.Единственные требования к хранению строковых литералов приведены в C99 6.4.5 / 5 «Строковые литералы»:

  • «массив статической длительности и длины хранилища, достаточных для того, чтобы содержать последовательность», котораяозначает, что у литерала будет время жизни, равное длине программы.
  • «Не определено, различаются ли эти массивы при условии, что их элементы имеют соответствующее значение», что означает, что различные литералы "hello" в вашем примере могутили может не иметь тот же адрес.Вы не можете рассчитывать ни на одно поведение.
  • «Если программа пытается изменить такой массив, поведение не определено», что означает, что вы не можете изменить строковый литерал.На многих платформах это применяется (если вы попытаетесь это сделать, программа потерпит крах).На некоторых платформах изменение может сработать, поэтому нельзя рассчитывать на очевидную ошибку.
1 голос
/ 13 июля 2011

Ваше понимание верно, данные "Hello" будут помещены в сегмент RO, а его относительный виртуальный адрес будет назначен указателям в функциях testX ().

Однако это специфичные для компилятора перспективы, стандарт C не заботится о них.

РЕДАКТИРОВАТЬ: Для test3 (), см. Комментарий τεκ.

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