【发布时间】:2021-05-10 05:29:04
【问题描述】:
我刚刚完成了大学的С语言课程。有人告诉我变量是如何存储在 pc 内存中的,并且数组 是连续存储的。 在以下示例中可以看到:
#include <stdio.h>
void main(){
char a[3][6];
printf("[0][0]->%p \t[1][0]->%p\t [0][5] %p \n", &a[0][0],&a[1][0], &a[0][5]);
printf("%p %p", a, &a[0][0]);
}
输出会是这样的:
[0][0]->0061FF06 [1][0]->0061FF0C [0][5] 0061FF0B
0061FF06 0061FF06
并且! a 的地址将与a[0][0] 的地址相同。
并且 sizeof(a) 是 18(在这个例子中)。
但是......说到动态数组......这里,你自己看看。
#include <stdio.h>
#include <stdlib.h>
void main()
{
char **a = (char **)malloc(3 * sizeof(char*));
for(int i=0; i < 3; i++)
a[i] = (char *)malloc(6 * sizeof(char));
printf("[0][0]:%p [1][0]%p [0][5]%p\n", &a[0][0], &a[1][0], &a[0][5]);
printf("a:%p [0][0]: %p\n", a, &a[0][0]);
printf("[1][0] - [0][5] = %d \n", &a[1][0] - &a[0][5]);
printf("%d", sizeof(a) );
}
结果会是这样的:
[0][0]:00AD1588 [1][0]00AD1598 [0][5]00AD158D
a: 00AD15D8 [0][0]: 00AD1588
[1][0] - [0][5] = 11
4
-
为什么在动态
[1][0] - [0][5]中不等于 1(如在静态数组中)? -
为什么在动态
sizeof(a)中是 4 ? -
为什么在
a和&a[0][0]的动态地址中不妥协?
【问题讨论】:
-
因为你所说的
dynamic array实际上是一个指针,它的行为非常不同。 -
"数组是连续存储的" - 这不是真的 - 我认为你的意思是数组 元素 是顺序存储的。
-
为什么,因为二维动态数组不同于二维静态数组,(前者不是连续存储来给出一个简单的区别)为什么你认为它们应该是一样吗?
-
@john 是时候给班级教授在班级评估表上打低分了,我想。
-
您的两个示例不等效。当您拥有
a[3][6]时,所有元素在内存中都是连续的。当你这样做时:int **a = malloc(...);然后循环填充malloc,a中的指针数组是连续的,但a的每个元素都是单独分配的,不会是连续的。如果您想要一个连续的动态数组,请执行以下操作:int (*a)[3][6] = malloc(sizeof(int) * 3 * 6);