2D динамически распределяемый массив, имеющий доступ к большему количеству памяти, чем выделенный размер - PullRequest
0 голосов
/ 09 февраля 2019

Я создал 2d массив символов.Для каждого arr [0], который я выделяю, я выделяю для него один столбец "arr [0] [0], arr [1] [0], ..." Однако у меня есть доступ к большему количеству памяти, чем выделено для каждого столбца.У меня есть доступ к arr [0] [1], arr [0] [2], ... Согласно пониманию, у меня не должно быть доступа к arr [0] [1], если я не выделю для него память.

Я включил комментарии, отражающие мое понимание кода

char ** sArr = malloc(sizeof(char*)); // create sArr[0]
sArr[0] = malloc(sizeof(char*));   // create sArr[0][0]
sArr[0][0] = 'a';
sArr[0][1] = 'b';
sArr[0][2] = 'c'; 
printf("%c\n", sArr[0][0]);  // outputs 'a' as expected
printf("%c\n", sArr[0][1]);  // outputs 'b', expected error or garbage
printf("%c\n", sArr[0][2]);  // outputs 'c', expected error or garbage

Я считаю, что смогу назначить

sArr[0][1]='b' 

, только если я использовал

sArr[0] = malloc(2*sizeof(char*));

1 Ответ

0 голосов
/ 09 февраля 2019

Вы выделили пространство для sizeof(char *), указатель на символ.Размер указателя, вероятно, составляет четыре или восемь байтов в зависимости от вашей системы.Если вместо этого вы выделите место для sizeof(char) (один байт) и попытаетесь получить доступ за пределами массива, вы будете вызывать неопределенное поведение (плохая идея).

...