#include <stdio.h>
int main()
{
char str[3][15] = {"Pointer to","char","program"};
char (*pt)[15] = str; // statement A
char *p = (char *)str; // statement B
printf("%s\n",p[3]); // statement C - Seg Fault in this line
printf("%s\n",p); // working properly displaying "Pointer to"
printf("%s\n",p+1); // here it is pointing to second element of first array so displaying "ointer to"
printf("%s\n",pt+1); // printing properly "char" as expected
int num[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*nm)[3] = num[1];
int *n = num;
printf("n - %d\n",n[10]); // statement D
printf("nm - %d\n",nm[0][0]);
return 0;
}
Мои вопросы:
Пожалуйста, помогите мне получить четкое представление о механизме хранения данных в случае массива char и массива int
В приведенной выше программе я понимаю, что когда указатель на массив символов указывает на 2D-массив символов, как показано в операторе A, он отображается правильно, но когда на него указывает обычный указатель char и пытается напечатать char в операторе C, он получает SegFault , вместо этого он должен печатать 'n' (3-й номер char в первом массиве «Указатель на»), поэтому возникает путаница, почему в случае массива int я получаю правильный элемент n = 11 в операторе D и почему в этом случае (оператор C) это не правильно печатает.
Как данные будут храниться в случае массива символов, будут ли они храниться в этой форме, показанной ниже.
char str[3][15] = {{'P','o','i','n','t','e','r',' ','t','o'},
{'c','h','a','r'},
{'p','r','o','g','r','a','m'}};
если он хранится так, то он должен работать как массив целочисленных указателей, показанный в операторе D. Пожалуйста, помогите мне разобраться с этой проблемой и прояснить проблему, которая у меня есть в случае хранения массива char и int.
num
выделяется как единый массив, к которому компилятор обращается по следующей формуле: если операторnum[row][col]
, то он такой же, как*((int *)num + row * 4 + col)
. - person miravalls   schedule 28.07.2016p = str[0]
, потому что массив объявляется в стеке.p[3]
возвращает символ, а не адрес, как отмечает @LPs. Если вы хотите напечататьp[3]
, спецификатор формата должен быть%c
. - person miravalls   schedule 28.07.2016