在C语言中,我知道可以使用以下代码在堆上动态分配一个二维数组:
int** someNumbers = malloc(arrayRowssizeof(int));
for (i = 0; i < arrayRows; i++) { someNumbers[i] = malloc(arrayColumns*sizeof(int)); } 显然,这实际上创建了指向一堆单独的一维整数数组的一维指针数组,并且“系统”可以弄清楚我要问的意思:
someNumbers[4][2]; 但是当我静态声明一个2D数组时,如以下行所示:
int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS]; ...是否在堆栈上创建了类似的结构,还是完全是另一种形式?(即,它是一维指针数组吗?如果不是,它是什么,以及如何找出对其的引用?)
另外,当我说“系统”时,实际上是由什么来弄清楚这一点?内核?还是C编译器在编译时将其整理出来?
静态二维数组看起来像数组的数组-它只是连续排列在内存中。数组与指针不是一回事,但是由于您经常可以互换使用它们,因此有时会造成混淆。但是,编译器会正确跟踪,从而使所有内容都很好地排列在一起。您必须对静态2D数组保持谨慎,就像您提到的那样,因为如果您尝试将一个数组传递给带有int **参数的函数,那么将会发生不好的事情。这是一个简单的示例:
int array1[3][2] = {{0, 1}, {2, 3}, {4, 5}}; 在内存中看起来像这样:
0 1 2 3 4 5 完全相同:
int array2[6] = { 0, 1, 2, 3, 4, 5 }; 但是,如果您尝试传递array1给此函数:
void function1(int **a); 您会收到警告(该应用将无法正确访问阵列):
warning: passing argument 1 of ‘function1’ from incompatible pointer type 因为2D数组与相同int **。可以说,将数组自动衰减为指针只能达到“一级深度”。您需要将函数声明为:
void function2(int a[][2]); 要么
void function2(int a[3][2]); 使一切变得快乐。
这个相同的概念扩展到n维数组。但是,在您的应用程序中充分利用这种有趣的业务通常只会使其更难理解。所以要小心。
问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。