2015-02-11 235 views
0
char *c = (char *)malloc(30*sizeof(char)); 
printf("%lu \n",sizeof(c)); 

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

问题是什么?我怎样才能确定一个数组的大小?

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

+4

'sizeof(c)'是一个编译时常量,不是运行时计算的值。 – 2015-02-11 12:42:38

+1

注意:你应该为'size_t'(这是'sizeof()'返回的类型)使用'“%zu”'而不是''%lu'''。你的代码是64位Windows和少数POSIX系统的UB(因为'size_t'是64位,而'long unsigned int'是32位)。 – 2015-02-11 12:50:03

+3

[请不要在C]中抛出'malloc()'的返回值(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 – unwind 2015-02-11 12:53:46

回答

8

目前,您正在询问64位机器上的指针大小是8个字节。由于这是malloc而不是真实数组,因此无法检索通过c分配的缓冲区的大小。

如果c被宣布为

char c[30]; 

你可以决定大小与

size_t size = sizeof(c)/sizeof(c[0]) 

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

0

sizeof是一个运算符,而不是一个函数,因此编译器创建的代码等价于类似于sizeof(char *)之类的代码,并且char的指针(取决于当然的体系结构)是8个字节。

0

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

2

您正在打印的系统中的(char *)的大小为8. 如果您想知道后者,“malloc”ed的内存量必须存储在某处。在你的情况下,如果你需要它,你应该存储'30'以备将来使用。

0

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

1

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

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

+0

@CoolGuy - 谢谢,我的错字。 – Sean 2015-02-11 13:05:38

+0

另外,实际分配的内存可能更大,所以即使有'memlen'这样的函数,它也几乎没用。例如,为了对齐目的,它可能会达到某个“N”的倍数。当然,你不应该依赖代码中的内容(如果你需要更多的字节,可以要求更多的字节!)。 – 2015-02-11 13:07:29

相关问题