Указатель на массив символов - PullRequest
0 голосов
/ 01 июля 2011
int main( ){    
    char a[2];
    char *p;
    p=&a[0];
    *(p+5)='g';
}

В приведенной выше программе я определил указатель, указывающий на массив символов, но этот массив составляет всего 3 байта.Позвольте мне рассказать вам более четко, например, допустим, что адрес массива char равен 1000, поэтому он занимает до 1003 байтов, но с помощью указателя я сохраняю значение ASCII 'g' в местоположении 1005.Это нормально с компилятором?Это память статически распределенная?или можно использовать снова?Будет ли это значение постоянно храниться в нем или нет?

Ответы [ 4 ]

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

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

3 голосов
/ 01 июля 2011

адрес массива символов равен 1000, поэтому он занимает до 1003 байтов

Обычно char имеет длину 1 байт.Таким образом, массив char, имеющий 2 char s, займет два байта: 1000 и 1001.

Это нормально с компилятором?компилятор.C позволяет вам делать все, что вы захотите, включая сбой системы.

Является ли эта память статически распределенной?или можно использовать снова?Будет ли это значение постоянно храниться в нем или нет?

Эта память не выделена для использования вашей программой.Вы обещали, что будете использовать только местоположения 1000 и 1001. Если вы получаете доступ к чему-либо кроме этого, это неопределенное поведение .Все может произойти, и в таких случаях ничего не гарантируется.

2 голосов
/ 01 июля 2011

Это нормально для компилятора, но может вызвать проблемы во время выполнения, поскольку, кто знает, что находится по адресу, по которому вы пишете.

1 голос
/ 01 июля 2011

Прежде всего вы объявили массив символов, который будет содержать только 2 символа, а не 3. Если вы попытаетесь это сделать, поведение будет неопределенным.

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