📜  不要将 sizeof 用于 C 中的数组参数(1)

📅  最后修改于: 2023-12-03 15:21:32.066000             🧑  作者: Mango

不要将 sizeof 用于 C 中的数组参数

在 C 语言中,使用 sizeof 运算符可以获取一个数据类型、变量或数组在内存中所占用的字节数。然而,使用 sizeof 运算符时需要注意一些细节,特别是在处理数组参数时,应该尽量避免使用 sizeof。

为什么不要使用 sizeof 处理数组参数

在 C 语言中,当我们将一个数组作为参数传递给一个函数时,实际上会把数组的地址传递给函数。在函数中处理数组时,数组的名称实际上就是一个指向数组第一个元素的指针。因此,使用 sizeof 运算符计算数组参数的大小时,结果与数组本身的大小不同,而是返回指针的大小。

考虑以下示例代码:

#include <stdio.h>

void print_arr(int arr[]) {
    printf("Size of array in bytes = %d\n", sizeof(arr));
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    print_arr(arr);
    return 0;
}

在上述代码中,我们定义了一个 print_arr 函数,它接受一个整型数组作为参数。在主函数中,我们定义一个整型数组 arr,并将其传递给 print_arr 函数。

如果我们运行这个程序,会得到以下输出:

Size of array in bytes = 4

显然,我们期望的结果应该是数组的大小,即 20 字节(假设 int 的大小为 4 字节)。然而,在函数中使用 sizeof 运算符计算数组参数大小时,实际上只返回了指针的大小,即 4 字节。

如何计算数组的大小

为了正确计算数组的大小,我们可以使用一个表达式来计算数组中元素的个数,再乘以每个元素的大小。例如,在上述示例代码中,我们可以按以下方式修改:

#include <stdio.h>

void print_arr(int arr[], int size) {
    printf("Size of array in bytes = %d\n", size * sizeof(int));
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(int);
    print_arr(arr, size);
    return 0;
}

在上述代码中,我们定义了一个新的参数 size,它表示数组中元素的个数。然后,在主函数中,我们通过 sizeof(arr) / sizeof(int) 计算了数组的大小,并将其传递给 print_arr 函数。在函数中,我们使用 size * sizeof(int) 计算数组的大小,并输出结果。

如果我们重新编译并运行代码,会得到以下输出:

Size of array in bytes = 20

这个结果是我们期望的。

结论

在 C 语言中,使用 sizeof 运算符可以获取一个数据类型、变量或数组在内存中所占用的字节数。然而,当处理数组参数时,应该避免使用 sizeof 运算符,因为它只返回指针的大小,而不是数组本身的大小。为了正确计算数组的大小,我们可以使用一个表达式来计算数组中元素的个数,再乘以每个元素的大小。