C语言 使用 sizeof(array) 返回的是数组的总字节数。对于静态数组,sizeof 可以在编译时确定数组的大小。如想要获取动态分配数组的大小,必须手动跟踪数组的大小,或者使用其他方法(如存储数组的大小作为额外的变量)。

1、对于静态数组(静态分配的数组)

当使用 sizeof 来获取一个静态数组的大小时,它会返回该数组的总字节数(即数组元素的字节数 * 元素个数)。可以在编译时计算出来,因此对于静态数组,sizeof 的返回值是确定的。

#include <stdio.h>

int main() {
    int array[10];  // 静态数组,包含 10 个整数
    printf("Size of array: %zu\n", sizeof(array));  // 返回数组的字节数
    return 0;
}

2、对于指针(动态分配的数组)

当用 sizeof 获取一个指针的大小时,返回的是指针本身的大小,而不是它所指向的内存块的大小。指针的大小取决于平台(在 32 位系统上通常是 4 字节,在 64 位系统上通常是 8 字节)。

#include <stdio.h>

int main() {
    int *array = malloc(10 * sizeof(int));  // 动态分配内存,包含 10 个整数
    printf("Size of array pointer: %zu\n", sizeof(array));  // 返回指针的字节数
    free(array);  // 释放内存
    return 0;
}

3、sizeof 在函数中的行为

如果数组作为参数传递到函数中,sizeof 不再返回数组的大小,而是返回指针的大小。因为在函数中,数组会退化为指针。

#include <stdio.h>

void print_size(int *array) {
    printf("Size of array in function: %zu\n", sizeof(array));  // 返回指针的大小
}

int main() {
    int array[10];
    print_size(array);  // 传递数组作为参数
    return 0;
}

4、sizeof 操作符的使用

sizeof 操作符用于获取数据类型或数据对象的大小(以字节为单位)。它在编译时确定大小,因此不会引入运行时开销。

#include <stdio.h>

int main() {
    // 数据类型大小
    printf("Size of char: %zu bytes\n", sizeof(char));
    printf("Size of int: %zu bytes\n", sizeof(int));
    printf("Size of float: %zu bytes\n", sizeof(float));
    printf("Size of double: %zu bytes\n", sizeof(double));
    
    // 变量大小
    int a = 10;
    double b = 3.14;
    
    printf("Size of variable a: %zu bytes\n", sizeof(a));
    printf("Size of variable b: %zu bytes\n", sizeof(b));

    // 数组大小
    int arr[5];
    printf("Size of array arr: %zu bytes\n", sizeof(arr));
    printf("Size of one element in arr: %zu bytes\n", sizeof(arr[0]));
    
    // 指针大小
    int *ptr = &a;
    printf("Size of pointer ptr: %zu bytes\n", sizeof(ptr));

    // 结构体大小
    struct Person {
        char name[50];
        int age;
    };
    
    struct Person person;
    printf("Size of struct Person: %zu bytes\n", sizeof(struct Person));
    
    return 0;
}

推荐文档