为什么我总是得到8?

Why am I getting 8 always?

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

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

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

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

目前您要求的指针大小在 64 位机器上是 8 个字节。由于这是 malloc 而不是真正的数组,因此您无法检索通过 c.

分配的缓冲区的大小

如果 c 被声明为

char c[30];

您可以通过

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

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

sizeof 是运算符,而不是函数,因此编译器创建的代码等同于 sizeof(char *) 和 char 指针(当然取决于体系结构)是 8 个字节.

实际上 sizeof(*c) 会 return 1. mallocced 缓冲区的大小无法在编译时确定(这是 sizeof 所做的)。

您正在打印 char * 的大小,在您的系统中是 8。

如果您想知道“malloc”的内存量,您必须将它存储在某个地方。在您的情况下,您应该存储 30 以备将来需要时使用。

您获取的是变量 c 的大小,而不是它指向的内存区域的大小。无法在函数内获取数组的大小,因为它总是衰减为指针。您必须自己存储尺寸。如果您已将大小传递给 malloc 那么为什么不能将该大小存储到变量中?

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

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