为什么我总是得到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)
会给你分配的金额。
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)
会给你分配的金额。