当我们使用malloc创建二维数组时如何分配内存?

时间:2016-08-04 19:54:10

标签: c memory malloc allocation

我想使用array[5][10]创建一个整数malloc()array[0]array[1]的内存地址之间的差异显示为8。为什么呢?

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *b[5];

    for (int loop = 0; loop < 5; loop++)
        b[loop] = (int*)malloc(10 * sizeof(int));

    printf("b=%u  \n", b);
    printf("(b+1)=%u \n", (b + 1));
    printf("(b+2)=%u \n", (b + 2));
}

输出结果为:

b=2151122304
(b+1)=2151122312 
(b+2)=2151122320

4 个答案:

答案 0 :(得分:4)

  

数组[0]和数组[1]的内存地址之间的差异显示为8.为什么?

这是因为您平台上指针的sizeof8

顺便说一下,使用%u来打印指针会导致未定义的行为。请改用%p

printf("(b+1)=%p \n",(b+1));
printf("(b+2)=%p \n",(b+2));

指针数组与2D数组之间的差异

使用时:

int *b[5];

用于b的内存是:

&b[0]     &b[1]    &b[2]
 |        |        |
 v        v        v
 +--------+--------+--------+
 |  b[0]  |  b[1]  |  b[2]  |
 +--------+--------+--------+

(b+1)&b[1]相同 (b+2)&b[2]

相同

因此,(b+2)(b+1)之间的差异是指针的大小。

使用时:

int b[5][10];

用于b的内存是:

&b[0][0]                                          &b[1][0]                                          &b[2][0]
|                                                 |                                                 |
v                                                 v                                                 v
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ ...
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    | ...
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ ...

(b+1)&b[1]相同,该指针的值与&b[1][0]的值相同,即使它们是指向不同类型的指针。
(b+2)&b[2]相同,该指针的值与&b[2][0]

的值相同

因此,(b+2)(b+1)之间的差异是10 int s的大小。

答案 1 :(得分:2)

首先,使用int *b[5],你不是创建一个二维数组,而是一个指针数组。

数组b的元素是指针。每个占用指针的大小,这取决于您的架构。在64位架构中,它可能占用64位(8字节)。您可以打印sizeof(int*)sizeof(b[0])

来检查

答案 2 :(得分:2)

内存分配看起来像

   b
+-----+
|     |                +------+------+-----------+-----+-----+-----+-----+
| b[0]+--------------> |      |      |           |     |     |     |     |
|     |                +------+------+-----------+-----+-----+-----+-----+
+-----+
|     |                +------+------+-----------+-----+-----+-----+-----+
| b[1]+--------------> |      |      |.......    |     |     |     |     |
|     |                +------+------+-----------+-----+-----+-----+-----+
+-----+
|     |                +------+------+-----------+-----+-----+-----+-----+
| b[2]+--------------> |      |      | ......    |     |     |     |     | 
|     |                +------+------+-----------+-----+-----+-----+-----+
+-----+
|     |                +------+------+-----------+-----+-----+-----+-----+
| b[3]+--------------> |      |      | ......    |     |     |     |     |
|     |                +------+------+-----------+-----+-----+-----+-----+
+-----+
|     |                +------+------+-----------+-----+-----+-----+-----+
| b[4]+--------------> |      |      | ......    |     |     |     |     |
|     |                +------+------+-----------+-----+-----+-----+-----+
+-----+
衰退后,

b会指向b[0]b + 1会指定b[1]的地址。机器上指针的大小为8个字节,因此您在地址中的差异为8。

除此之外

  1. 不要转换malloc

    的返回值
    b[loop]=malloc(10*sizeof(int));  
    
  2. 并使用%p作为指针数据类型

    printf("b=%p  \n",(void *)b);
    printf("(b+1)=%p \n",(void *)(b+1));
    printf("(b+2)=%p \n",(void *)(b+2));
    

答案 3 :(得分:1)

您声明的内容在技术上不是二维数组,而是指向int的指针数组,每个指针指向一个int数组。 array[0]array[1]相隔8个字节的原因是因为你有一个指针数组,系统上的指针是8个字节。

当您分配每个单独的1维数组时,它们不一定在内存中彼此相邻。另一方面,如果您声明int b[5][10],则将有10 * 5 = 50个连续的整数,排列为5行,每行10个。