首先,我已经审查了这些:
How are multi-dimensional arrays formatted in memory?
Memory map for a 2D array in C
从那里可以看出,2D阵列与char **不同,但在内存中它们看起来与完全相同。这听起来很奇怪,所以我研究了以下内容:
#include <stdio.h>
char func(char** m) {
return m[0][0]; //only works for char**, already discussed in the other SO question
}
int main() {
//char a[4][2]; //a 2D char array
int row = 4, col = 2; //char**
char** a = malloc(row * sizeof(char*));
int i;
for (i = 0; i < row; i++) {
a[i] = malloc(col * sizeof(char));
}
//checking the output
printf(" &a = %u\n", &a);
printf(" &a[0] = %u\n", &a[0]);
printf("&a[0][0] = %u\n", &a[0][0]);
printf(" a = %u\n", a);
printf(" a[0] = %u\n", a[0]);
//printf(" a[0][0] = %u\n", a[0][0]); //char value in a[0][0], here a garbage value
//char m = func(a); //only works for char**, already discussed in the other SO question
return 0;
}
char **的可能输出:
&a = 3209288 // &a
&a[0] = 4083720 // &(*(a+0)) = a
&a[0][0] = 4083784 // &(*(*(a+0)+0)) = *a
a = 4083720 // a
a[0] = 4083784 // *(a+0) = *a
2D char数组的可能输出:
&a = 3473104 // &a
&a[0] = 3473104 // a
&a[0][0] = 3473104 // *a
a = 3473104 // a
a[0] = 3473104 // *a
很容易理解char **的输出。但是2D char数组的输出看起来很奇怪,尽管在其他SO问题中讨论过。我无法想到任何数据类型的指针 x ,
x = &amp; x = * x
并且所有3件物品都存在于同一块内存中。希望我的困惑是可以理解的。任何人都可以解释这个谜团吗?
答案 0 :(得分:0)
当您使用数组的名称是除&array
和sizeof array
之外的任何表达式时,此名称将自动转换为指向数组的第一个元素的指针(char [5][10]
将转换为char (*)[10]
)。该指针的地址将等于整个数组的地址
所以,“sizeof(char [5] [10])== 50”,没有额外的指针。
char arr[5][10];
&a = 3473104 // Address of entire array, (char (*)[5][10])
&a[0] = 3473104 // Address of first row, (char (*)[10])
&a[0][0] = 3473104 // Address of first char, (char *)
a = 3473104 // "a", (char [5][10]), converted to "&a[0]", (char (*)[10])
a[0] = 3473104 // "a[0]", (char[10]), converted ro "&a[0][0]", (char *)