23

可能重复:
如何找到 sizeof(指向数组的指针)

我正在学习如何在 C 中创建动态数组,但遇到了一个我无法弄清楚的问题。

如果我使用代码:

int num[10];
for (int i = 0; i < 10; i++) {
    num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));

我得到输出:

sizeof num = 40
sizeof num[0] = 4

这是我期望发生的。但是,如果我 malloc 数组的大小,例如:

int *num;
num = malloc(10 * sizeof(int));
for (int i = 0; i < 10; i++) {
    num[i] = i;
}
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0]));

然后我得到输出:

sizeof num = 8
sizeof num[0] = 4

我很想知道为什么当我使用固定长度方法时数组的大小是 40,而当我使用malloc().

4

4 回答 4

32

第二种情况,num不是数组,是指针。sizeof给你指针的大小,在你的平台上似乎是 8 个字节。

无法知道动态分配的数组的大小,您必须将其保存在其他地方。sizeof看类型,但是不能以任何方式int[5]从 的结果中获取完整的数组类型(指定大小的数组类型,比如 type ) ,并且参数不能应用于不完整的类型,比如.mallocsizeofint[]

于 2012-12-22T16:57:58.297 回答
5

数组不是指针(在某些情况下衰减到指针,而不是在这里)。

第一个是一个数组 - 所以sizeof给你数组的大小 = 40 字节。

第二个是指针(无论它指向多少个元素) -sizeof给你sizeof(int*).

于 2012-12-22T16:58:22.410 回答
2

如果你想知道你分配的东西的大小,那么你需要自己“记住”这一点,因为你的代码做了分配。如果您的代码没有完成分配,那么[在标准意义上] 就无法找出指针指向的内存有多大。你只需要以其他方式“知道”。

于 2012-12-22T17:02:12.577 回答
2

第二个大小指的是指针的大小,在你的机器上——可能是 64 位——是 8 个字节。

您不能使用它sizeof()来恢复动态分配结构的大小,但可以对静态分配的结构这样做。

于 2012-12-22T16:58:20.597 回答