首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >多维数组在内存中是如何格式化的?

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

Stack Overflow用户
提问于 2010-04-02 12:46:43
回答 3查看 81.9K关注 0票数 201

在C语言中,我知道我可以使用以下代码在堆上动态分配一个二维数组:

int** someNumbers = malloc(arrayRows*sizeof(int*));

for (i = 0; i < arrayRows; i++) {
    someNumbers[i] = malloc(arrayColumns*sizeof(int));
}

显然,这实际上创建了一个一维数组的指针,指向一组单独的一维数组的整数,“系统”可以理解我的意思,当我问:

someNumbers[4][2];

但是当我静态地声明一个2D数组时,如下面的代码行所示:

int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS];

...does在堆栈上创建了一个类似的结构,还是完全是另一种形式?(例如,它是一维指针数组吗?如果不是,它是什么,它的引用是如何计算出来的?)

还有,当我说“系统”的时候,到底是什么导致了这个问题呢?内核?或者是C编译器在编译时对其进行排序?

EN

回答 3

Stack Overflow用户

发布于 2013-02-01 21:02:19

unsigned char MultiArray[5][2]={{0,1},{2,3},{4,5},{6,7},{8,9}};

内存中的值等于:

unsigned char SingleArray[10]={0,1,2,3,4,5,6,7,8,9};
票数 29
EN

Stack Overflow用户

发布于 2010-04-02 13:13:28

作为对您的also的回答:两者都是,尽管大部分繁重的工作都是由编译器完成的。

在静态分配数组的情况下,"The System“将是编译器。它将像为任何堆栈变量保留内存一样保留内存。

在malloc数组的情况下,"The System“将是malloc(通常是内核)的实现者。编译器将分配的全部是基指针。

编译器总是会像声明的那样处理类型,除非在Carl给出的例子中,它可以计算出可互换的用法。这就是为什么如果你传入一个函数,它必须假设它是一个静态分配的平面,其中**被假设为指向指针的指针。

票数 5
EN

Stack Overflow用户

发布于 2016-02-09 20:51:13

要访问特定的二维数组,请考虑数组声明的内存映射,如以下代码所示:

    0  1
a[0]0  1
a[1]2  3

要访问每个元素,只需将您感兴趣的数组作为参数传递给函数即可。然后使用offset for column单独访问每个元素。

int a[2][2] ={{0,1},{2,3}};

void f1(int *ptr);

void f1(int *ptr)
{
    int a=0;
    int b=0;
    a=ptr[0];
    b=ptr[1];
    printf("%d\n",a);
    printf("%d\n",b);
}

int main()
{
   f1(a[0]);
   f1(a[1]);
    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2565039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档