一个简单的问题是我的错误。 说我有在主定义像这样的阵列int arr[5]
现在,如果我仍然内部主要和我设置int i = sizeof(arr)/sizeof(arr[0])
然后我被设置为5,但如果我传递数组作为函数参数和做同样的计算这个功能,我得到一个不同的数字。 这是为什么? 起初我以为它,因为在一个函数arr
是一个指针,但据我所知arr
是里面的指针主呢!
另外,如果我做的非常类似的东西只有我动态初始化数组,我得到怪异的结果:
int *arr = (int*) malloc(sizeof(int) * 5);
int length = sizeof(*arr) / sizeof(arr[0]);
printf("%d\n",length);
这里的输出是1
。 任何想法,为什么? 提前致谢!
C数组不存储自己的尺寸在任何地方,这样sizeof
只能指望你如果大小是在编译时已知的方式。 malloc()
是由编译器处理过的任何其他功能,使sizeof
不能告诉arr
指向数组的第一个元素,更何况这是多么大。 如果您需要知道数组的大小,你需要明确它传递给你的功能,无论是作为一个单独的参数,或者使用含的一个指针数组,其大小的结构体。
这是因为现在编曲是一个指针,它可以指向一个int或1000个整数数组功能只是不知道。 您将有数组的大小传递到功能。
在主ARR被声明为[5]等大小可以通过编译器来计算一个int。
我不明白的第一个问题(张贴一些代码,请),但对于第二个:
sizeof(*arr) ; // is sizeof(int) as arr is of type "int *"
sizeof(arr[0]) ; // is sizeof(int), as arr[0] is the first
// item of an array of int
事实是, *arr
和arr[0]
的意思完全一样,但不同的说。 事实上,让说n是指数: *(arr + n)
比相同arr[n]
据我所知ARR是里面的指针主呢!
那是错误的。 在main
,在这里定义int arr[5]
arr
是一个数组,不是指针。 它的大小等于所述阵列的大小,所以5*sizeof(int)
。 当你通过它作为函数参数,该参数有型int*
,所以在函数内部,你服用的尺寸int*
而不是int[5]
在这里,输出为1。任何想法,为什么?
这一次, arr
确实是一个指针,因为你宣布它int *arr
。 但无论哪种方式,无论是int *arr
或int a[5]
*arr
和arr[0]
的意思是完全一样的事情:第一个元素。 所以当然它们具有相同的大小,和sizeof(*arr) / sizeof(arr[0])
为1。
这是因为已知大小的数组的指针和指向未知大小的阵列之间的差异。 sizeof
是在编译时完成,这是不可能的编译器来告诉动态创建的内存区域的大小提前。
你应该了解的静态和动态数组之间的区别。 静态数组类型,如int
, float
, double
等,它们是不同的。 甚至
int a[10];
有不同的类型从
int b[11];
在编译时,在静态数组元素的数量是已知的,所述sizeof
操作符返回它们占据的字节数。
与被初始化的指针,或者指向一些变量,或者所分配的存储器,它是在运行时间在那里它们被指向和编译器不能确定什么将在该阵列的大小将是显而易见未来。 因此, sizeof
指针给你4(或8 64bits的系统例如)。
需要注意的是sizeof
在编译时操作者的作品,而不是在运行时。
如果您需要了解一个分配的内存(通过大小malloc
),你别无选择,只能对数组的大小,保存在另一个变量,例如,你做了之后malloc
。