как распределяется память, когда указатель на символ указывает на строку? - PullRequest
2 голосов
/ 07 октября 2011
#include<stdio.h>

int main(void)
{
    /* in this amessage is an array big enough to
     * hold  the sequence of character and '\0' */
    char amessage[] = "now is the time";

    /* in this case a character pointer is
     * pointing to a string constant */
    char *pmessage = "now is the time";

    return 0;
}

Я запутался, как распределяется память во втором случае ?? Является ли эта копия памяти частной .... Я имею в виду, безопасно ли писать что-то как 2-й stmt и быть уверенным, что что-то еще не перезапишет ту же самую память ??

Ответы [ 3 ]

6 голосов
/ 07 октября 2011
char *pmessage = "now is the time";

Создает строковый литерал, память для строки размещается где-то в месте только для чтения, это зависит от реализации деталей компиляторов.

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

2 голосов
/ 07 октября 2011

Строковые литералы могут быть разными или нет: это выбор компилятора ( C99 Standard говорит, что он не указан).

Предположим, на минуту, что изменение самих строковых литералов не было UB.

int main(void) {
    char *p = "now is the time";
    /* compiler makes sure there is a place with "now is the time"
    ** and makes p point there */
    char *q = "time";
    /* possibly, the compiler reuses the time from
    ** the previous string literal */

    q[0] = 'd'; /* technically UB: don't do this */
    puts(p);    /* possibly writes "now is the dime" */
}

Что касается вашего конкретного вопроса: , пока вы не вызываете UB , это безопасно. Память, выделенная компилятором, учитывает все другие виды использования всех других объектов.

0 голосов
/ 07 октября 2011

Это безопасно.Они будут размещены в стеке.Единственное, что отличается между amessage и pmessage, это то, что pmessage доступен только для чтения.

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