可能重复:
Behaviour of Sizeof in C
有人可以解释为什么下面的C代码表现如下:
#include <stdio.h>
int sizeof_func(int data[]) {
return sizeof(data);
}
int main(int argc, char *argv[]) {
int test_array[] = { 1, 2, 3, 4 };
int array_size = sizeof(test_array);
printf("size of test_array : %d.\n", array_size);
int func_array_size = sizeof_func(test_array);
printf("size of test_array from function : %d.\n",
func_array_size);
if (array_size == func_array_size) {
printf("sizes match.\n");
} else {
printf("sizes don't match.\n");
}
return 0;
}
我希望输出为:
size of test_array : 16.
size of test_array from function : 16.
sizes match.
但我得到了:
size of test_array : 16.
size of test_array from function : 4.
sizes don't match.
答案 0 :(得分:11)
当您将数组作为函数参数传递时,它会衰减到指向其第一个元素的指针
函数中的sizeof
返回指针的大小而不是数组
而sizeof
中的main()
返回数组的大小。当然,两者都不一样。
如果你想知道函数中数组的大小,你必须将它作为函数的单独参数传递。
int sizeof_func(int data[], size_t arrSize);
^^^^^^^^^^^^
答案 1 :(得分:4)
您的功能相当于:
int sizeof_func(int *data) {
return sizeof(data);
}
您的函数无法知道传递给它的数组大小,因为实际传递给它的所有内容都是指向数组第一个元素的指针。您使用的是32位系统,因此sizeof(int *)
为4。
实际上,sizeof(...)
是一个在编译时被评估的常量,所以你的sizeof_func
无法工作。相反,人们经常在C中做的是用指针传递一个整数,如下所示:
int function_that_operates_on_array(int *data, int size)
{
// do stuff with data[0] through data[size-1]
}
答案 2 :(得分:3)
int test_array[] = { 1, 2, 3, 4 };
int array_size = sizeof(test_array);
printf("size of test_array : %d.\n", array_size);
这里编译器将test_array
视为一个数组(它在编译时知道数组的实际大小),这就是为什么你得到test_array
的真实大小。
int func_array_size = sizeof_func(test_array);
printf("size of test_array from function : %d.\n",
func_array_size);
但是,如果将数组传递给函数,编译器会将其视为指向数组第一个元素的指针(在编译时,您的函数不知道数组的大小,因为您可以调用函数你之前声明过的任何数组)这就是你得到指针大小的原因。
答案 3 :(得分:1)
你定义的功能是,
int sizeof_func(int data [])
{
return sizeof(data);
}
这对于你的情况是不正确的,因为你在函数调用中将指针作为参数传递给数组的第一个元素。 例如int func_array_size = sizeof_func(test_array);
修改你的函数定义,如下所示,
int sizeof_func(int * data,int arraysize)
{
return (sizeof(data) * arraysize);
}
修改你的函数调用, int func_array_size = sizeof_func(test_array,4);
这应该有效。
答案 4 :(得分:1)
您需要注意两个C语言问题。
1)sizeof运算符的行为。它仅适用于具有静态大小的阵列。如果你有sizeof(test_array)
,那么它将适用于真正的数组:
int test_array[] = { 1, 2, 3, 4 };
int test_array[4] = { 1, 2, 3, 4 }; // completely equivalent
char test_array[] = "something";
将指针传递给它时不会工作。如果这样做,您将获得指针的大小。以下情况不起作用,它们将打印4(假设为32位):
int* pointer = test_array;
char* pointer = "something";
printf("%d", sizeof(pointer));
2)函数参数的行为。它们在C中有一个奇怪的语法。它们可以声明为数组,但它们不是:
void func (int* x); // x is a pointer
void func (int x[]); // x is a pointer
void func (int x[10]); // x is a pointer
以上3个是等价的,后两个只是“合成糖”来描述程序员的意图。
在所有这些情况下,任何调用sizeof(x)的尝试都将给出指针的大小。