C中行为的大小不一致

时间:2012-06-15 06:21:04

标签: c arrays sizeof

  

可能重复:
  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.

5 个答案:

答案 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)的尝试都将给出指针的大小。