char *, который указывает на буквальную строку (встроенную в исходный код) - это нормально? - PullRequest
3 голосов
/ 14 января 2010

Это нормально, что переменная char * будет указывать на строку (это записано в исходном коде)?
Могу ли я манипулировать / изменять пространство, выделенное для буквенной строки, если я не превышаю ее длину? Насколько я понимаю формат исполняемого файла, это нормально, но я хочу быть уверенным. Спасибо:)

Ответы [ 4 ]

9 голосов
/ 14 января 2010

Зависит немного от ваших характеристик времени выполнения, но в целом делает что-то вроде:

char *s = "a literal string";
s[3] = 'q';

скомпилируется, но не работает во время выполнения. Литеральная строка в этом случае обычно находится в разделе только для чтения исполняемого файла. Следующий пример, однако, будет работать:

char s[] = "a literal string";
s[3] = 'q';

В этом случае литеральная строка является инициализатором для массива (s) в стеке. Таким образом, ответ на ваш первый вопрос - «да», а ответ на ваш второй вопрос - «возможно».

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

2 голосов
/ 14 января 2010

Это нормально, что переменная char * будет указывать на строку (это записано в исходном коде)?

Обычно это нормально, но я бы пометил указатель как const, чтобы предотвратить непреднамеренные изменения.

Пример: const char *Str = "This is a hard string.";

Могу ли я манипулировать / изменять пространство, выделенное для буквенной строки, если я не превышаю ее длину?

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

1 голос
/ 14 января 2010

Попытка изменить строковый литерал вызывает неопределенное поведение. Лучше всего рассматривать строковые литералы как неписываемые.

1 голос
/ 14 января 2010

Буквенные строки всегда постоянны. Вы можете указать на них, но не писать над ними. У вас есть два варианта:

  1. Фактический массив:

    char s[] = "Hello you beautiful people";
    

    Это работает, потому что вы не указываете на буквальную строку; Вы инициализируете массив (который доступен для записи) содержимому литеральной строки.

  2. Скопировать строку в доступную для записи память:

    char *s = malloc(30);
    strncpy(s, "Hello you beautiful people", 30);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...