#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数组的数据存储机制。
在上面的程序中,当char数组指针指向2D char数组(如A语句所示)时,它能够正确显示,但是当由普通char指针指向并尝试在C语句中打印char时,会出现SegFault错误。实际上,它应该打印'n'(第一个数组“Pointer to”中的第三个字符),因此我对为什么在int数组中我可以在D语句中得到正确的元素n = 11而在这种情况下(C语句)无法正确打印感到困惑。
char数组的数据将如何存储?将以以下形式存储吗:
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数组存储方面所遇到的问题。
char str[3][15] = {{'P','o','i','n','t','e','r',' ','t','o','\0'}, {'c','h','a','r', '\0'}, {'p','r','o','g','r','a','m', '\0'}};
- LPsnum
被分配为单个数组,编译器使用以下公式访问它:给定语句num[row][col]
,则相当于*((int *)num + row * 4 + col)
。 - miravallsprintf("%s\n",p[3]);
-->printf("%s\n",&p[3]);
- LPsp = str [0]
相同,因为数组如何在堆栈上声明。p [3]
返回一个字符,而不是@LPs所指出的地址。 如果您想打印p [3]
,则格式说明符应为%c
。 - miravalls