4

可能重复:
C 中 Sizeof 的行为

有人可以解释为什么以下 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.
4

5 回答 5

11

当您将数组作为函数参数传递时,它会衰减为指向其第一个元素的指针。
sizeofin 函数返回指针的大小而不是数组。
同时,sizeofmain()数组的返回大小。当然,两者并不相同。

如果您想知道函数中数组的大小,则必须将其作为单独的参数传递给函数。

int sizeof_func(int data[], size_t arrSize);
                            ^^^^^^^^^^^^
于 2012-06-15T06:22:32.750 回答
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]
}
于 2012-06-15T06:26:14.067 回答
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);

但是,如果您将数组传递给函数,编译器会将其视为指向数组第一个元素的指针(在编译时,您的函数不知道数组的大小,因为您可以使用任何数组调用您的函数你之前已经声明过)这就是为什么你得到一个指针的大小。

于 2012-06-15T06:27:24.420 回答
1

你对功能的定义是,

int sizeof_func(int 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);

这应该有效。

于 2012-06-15T06:49:11.107 回答
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

上面三个是等价的,后面两个只是“语法糖”,用来说明程序员的意图。

在所有这些情况下,任何调用 sizeof(x) 的尝试都会给出指针的大小。

于 2012-06-15T07:01:34.063 回答