Доступ вне объявленной границы для элементов структуры или каждого измерения многомерного массива - PullRequest
3 голосов
/ 05 марта 2011

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

"Доступ вне объявленной границы для элементов структуры или каждого измерения многомерного массива."

Ответы [ 2 ]

1 голос
/ 05 марта 2011

Понятия не имею, откуда взялась эта цитата, но я могу попытаться дать какое-то объяснение.

Когда вы создаете массив (или malloc), компилятор (или libc) выделяет место в стеке (или куче) для хранения этих данных. Вокруг этих данных могут храниться другие фрагменты данных, и запись в индексы массива, которые превышают то, что было выделено, может повредить эти данные.

char x[5];
int y;
short z;

Raw memory: (just an example, likely to vary)
         00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
b0000000 xx xx xx xx xx -- -- -- yy yy yy yy zz zz -- --

где xx, yy и zz соответствуют переменным x, y и z соответственно, и - добавляется дополнение. Когда вы ссылаетесь на x[4], это соответствует адресу x+sizeof(x[0])*4 (обратите внимание, что не синтаксис C: обычная арифметика, а не арифметика указателей), который равен b0000004. Когда вы пишете в x[8], это соответствует b0000008, где y находится в этом примере. Записав x[8], вы фактически заставите значение y измениться!

Что теоретически может произойти (но не определено, что произойдет):

char x[5];
int y;
short z;

y = 0x12345678;
x[8] = 0xad;
x[9] = 0xde;

printf("%#x\n", y);
/* 0x1234dead is printed ?!? */
0 голосов
/ 05 марта 2011

Это сводится только к доступу за пределами массива :

int array[100];
int* pointer = array;
*(pointer + 100) = 0; // undefined behavior - the last valid index is 99
int value = *(pointer + 200); //undefined behavior just as well

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

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