开发者社区> 问答> 正文

多维数组如何在内存中格式化?

已解决

在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编译器在编译时将其整理出来?

展开
收起
保持可爱mmm 2020-02-06 22:29:51 527 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    静态二维数组看起来像数组的数组-它只是连续排列在内存中。数组与指针不是一回事,但是由于您经常可以互换使用它们,因此有时会造成混淆。但是,编译器会正确跟踪,从而使所有内容都很好地排列在一起。您必须对静态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

    2020-02-06 22:30:16
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
低代码开发师(初级)实战教程 立即下载