c - 通过calloc分配的多维数组

标签 c malloc calloc

我有一个关于当我calloc时内存是如何分配的问题。我看了看 this问题,但它没有解决在动态分配二维数组的情况下如何分配内存。

我想知道以下三种动态分配二维数组的方式在内存表示上是否存在差异。

类型 1:

double  **array1;
int ii;

array1 = calloc(10, sizeof(double *));
for(ii = 0; ii < 10; ii++) { 
   array1[ii] = calloc(10, sizeof(double));
}
// Then access array elements like array1[ii][jj]

类型 2:

double  **array1;
int ii;

array1 = calloc(10 * 10, sizeof(double *));
// Then access array elements like array1[ii + 10*jj]

类型 3:

double  **array1;
int ii;

array1 = malloc(10 * 10, sizeof(double *));
// Then access array elements like array1[ii + 10*jj]

根据我对callocmalloc 的理解,后两者的区别在于calloc 会将数组的所有元素归零,而 malloc 不会。但是前两种定义数组的方式在内存中是等价的吗?

最佳答案

Are the first two ways of defining the array equivalent in memory?

不完全是。在第二种类型中,它们几乎肯定是连续的,而在第一种类型中则不确定。

类型 1:内存中的表示形式如下:

          +---+---+---+---+---+---+---+---+---+---+
    double| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |   
          +---+---+---+---+---+---+---+---+---+---+ 
            ^
            |------------------------------------                                     
                .   .   .   .   .   .   .   .   |    // ten rows of doubles
                                                -
          +---+---+---+---+---+---+---+---+---+--|+
    double| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0||   
          +---+---+---+---+---+---+---+---+---+--|+
            ^   .   .   .                       -
            |   ^   ^   ^   .   .   .   .   .   |
            |   |   |   |   ^   ^   ^   ^   ^   |
          +-|-+-|-+-|-+-|-+-|-+-|-+-|-+-|-+-|-+-|-+
array1[ii]| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | // each cell points to ten doubles
          +---+---+---+---+---+---+---+---+---+---+
            ^
            |
            |
          +-|-+
    array1| | |
          +---+

类型 2:内存中的表示如下所示:

          +---+---+---+---+---+---+---+---+---+---+     +---+
    double| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 |  
          +---+---+---+---+---+---+---+---+---+---+     +---+
            ^   ^   ^   ^   ^   ^   ^   ^   ^   ^         ^
            |   |   |   |   |   |   |   |   |   |         |
            |   |   |   |   |   |   |   |   |   |         |
          +-|-+-|-+-|-+-|-+-|-+-|-+-|-+-|-+-|-+-|-+     +-|-+
array1[ii]| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... |99 | // each cell points to one double
          +---+---+---+---+---+---+---+---+---+---+     +---+
            ^
            |
            |
          +-|-+
    array1| | |
          +---+

关于c - 通过calloc分配的多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16715633/

相关文章:

c++ - 如何检查 malloc 是否持有锁

c - 指针数组更改值,使用 malloc 将内存分配给其他指针时

c - 理解 C 语言中的指针到指针逻辑

c - 返回数组指针时堆栈崩溃

c - 浮点值、运算符和函数有多不可靠?

c - 获取母函数 __FILE__

c - 无法解决此错误 "Access violation"

调用一个二维数组

c - 解决 C 中链表计数函数的边界错误

c - 尝试将 memset() 结构指针指向 0 时出现段错误