我想使用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
答案 0 :(得分:4)
数组[0]和数组[1]的内存地址之间的差异显示为8.为什么?
这是因为您平台上指针的sizeof
为8
。
顺便说一下,使用%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。
除此之外
不要转换malloc
b[loop]=malloc(10*sizeof(int));
并使用%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个。