0

我有一个关于 C sizeof() 函数的快速问题。我将一个数组传递给一个函数,在该函数内部,我想检查数组的大小。但是,无论输入数组的大小如何,在函数内部,它的大小似乎总是为 4。例如:

void checkArraySize(char data[])
{
    int internalSize = sizeof(data); //internalSize is reported as 4
}

void main(void)
{
    char data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
    int externalSize = sizeof(data); //externalSize is reported as 8

    checkArraySize(data);                                             
}

正如代码中的注释所示,在调用 checkArraySize() 之类的函数之前,我检查了数组的大小,结果显示为 8。但是,当我检查函数内部数组的大小时,它只报告有4 个元素(无论输入数组的大小如何,它都会报告 4 个元素)。

很多时候,当我看到这样的问题时,是因为我对这个话题的理解存在差距。所以,我确定我只是错过了传递数组的工作原理。如果没有,关于为什么会发生这种情况的任何想法?

注意:这是在 PIC32 上,所以我使用的是 Microchip 的 MPLAB X IDE 和 XC32 编译器。

4

3 回答 3

5
void checkArraySize(char data[])

将被翻译成

void checkArraySize(char* data)

因此,代码计算指针的大小。4 是您计算机中的指针大小。在 64 位系统中,它将输出 8。

于 2014-11-24T00:46:17.563 回答
2

C 中的数组总是通过引用传递。这就是为什么你每次都得到指针大小,而不是实际大小。

要将 C 中的数组作为参数使用,您应该使用数组传递数组的大小。

我将您的程序修改为工作状态:

typedef unsigned char BYTE;

void checkArraySize(BYTE data[], int sizeOfArray)
{
    int internalSize = sizeOfArray;   
    printf("%d", internalSize );                  
}

void main(void)
{
    BYTE data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
    int externalSize = sizeof(data)/sizeof(BYTE);                   //it would return number of elements in array

    checkArraySize(data, externalSize);                                             
}

通过引用传递意味着只发送数组第一个元素的地址。如果您在函数checkArraySize中更改任何内容,此更改也会反映到原始数组。检查修改上面的例子。

typedef unsigned char BYTE;

void checkArraySize(BYTE data[])
{
    int internalSize = sizeof(data);   
    printf("%d\n", internalSize );     
    data[3]=  0x02;             //internalSize is reported as 4
}

void main(void)
{
    BYTE data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
    int externalSize = sizeof(data);                   //externalSize is reported as 8
    printf("Value before calling function: 0x%x\n",data[3]);
    checkArraySize(data);  
    printf("Value after calling function: 0x%x\n",data[3]);
}

输出将是:

Value before calling function: 0x4
4
Value after calling function: 0x2
于 2014-11-24T00:55:49.043 回答
1

在 C 和 C++ 中,数组不是可复制的东西。因此,这些语言的发明者被迫在他们的第一个元素上添加一些从数组到指针的非直观自动类型转换,以便为程序员提供一种将数组作为参数传递给函数的方法。

对此类参数使用 sizeof 运算符(不是函数)返回指针类型的大小而不是数据大小。

额外的美分 sizeof 运算符在编译而不是运行时扩展。从另一端传递给函数的数组可能有不同的大小。因此将此类数组转换为指针有另一种解释:sizeof 在编译时无法解析不同数组的大小。

于 2014-11-24T00:47:47.693 回答