为什么我总是8岁?

时间:2015-02-11 12:40:28

标签: c arrays sizeof

char *c = (char *)malloc(30*sizeof(char));
printf("%lu \n",sizeof(c));

在上面的代码中,我试图打印'c'的大小。无论我在代码中给出的是什么数字而不是'30',我都将sizeof(c)设为8。

有什么问题?如何确定数组的大小?

数组的长度和大小是否相同?

6 个答案:

答案 0 :(得分:8)

此刻,您要求64位机器上的指针大小为8字节。由于这是malloc而不是真实数组,因此您无法检索通过c分配的缓冲区的大小。

如果c被声明为

char c[30];

您可以使用

确定尺寸
size_t size = sizeof(c)/sizeof(c[0])

但说实话,如果我必须这样做,我只会#define数组大小,即使在编译时会删除大小计算。在我看来,它使代码更清晰。

答案 1 :(得分:2)

您正在打印系统中的(char *)大小为8。 如果你想知道后者的内存量是什么,那么你必须将它存储在某个地方。在您的情况下,您应该存储' 30'如果您将需要它,以备将来使用。

答案 2 :(得分:1)

sizeof(c)表示给我变量c的大小。由于c是一个指针,它会返回指针在内存中占用的字节数。您看到的事实8表明您正在编译64位。在一个32位的内置它将是4。

记住你分配的东西的大小是你的工作。毕竟,你要求一些内存,所以你知道你分配了多少!在您的情况下,size_t size = 30*sizeof(char)会为您提供已分配的金额。

答案 3 :(得分:0)

sizeof是一个运算符,而不是一个函数,因此编译器创建的代码类似于sizeof(char *),而char的指针(当然取决于架构)是8个字节。 / p>

答案 4 :(得分:0)

实际上sizeof(* c)将返回1. mallocced缓冲区的大小无法确定编译时间(这与sizeof有关)。

答案 5 :(得分:0)

你得到变量c的大小,而不是它指向的内存区域的大小。没有办法获得函数内任何数组/结构对象的大小,因为它总是衰减到指针。您必须自己存储尺寸。如果您已将大小传递给malloc,那么为什么不能将该大小存储到变量?