C语言中的sizeof用法

本文详细介绍了C语言中sizeof关键字的含义及其使用方法。包括用于不同类型和变量时的大小计算,以及在联合类型、结构类型中的应用,还有需要注意的特殊情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么。我以前也有用错的时候,现在写一写,也算是提醒一下自己吧。反正现在来看,还在搞sizeof是什么意思,怎么用正确,还是有点搞笑,都经常用的东西,没有理解透彻,就差的太远了。

第一  sizeof是什么

  sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等,sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。这个操作数不好理解对吧?后面慢慢看就明白了。sizeof的返回值是size_t,在64位机器下,被定义为long unsigned int。

第二 sizeof如何使用

1、用于数据类型

  使用形式: sizeof(type)。其中type如int 、double等。 例如sizeof(int)、sizeof(char*)、sizeof(double)。这个时候sizeof后面的类型必须用括号()包起来,不包起来是错误的,通过不了编译。其中sizeof(void*)在64位下是8,而sizeof(void)是1。其实,在C语言中sizeof(函数),如sizeof(main),结果也是1。但是在C++中,sizeof(void)和sizeof(函数)都是非法的,通过不了编译,后面C++就不说了,现在讲C嘛。其实sizeof(函数),sizeof(void)虽然是1,但是是不正确的使用方式。

2、用于变量

  使用形式: sizeof(var)或sizeof var。当操作基本数据类型的时候,在我64位电脑的结果如下

sizeof(char) 1
sizeof(char) 1
sizeof(short) 2
sizeof(int) 4
sizeof(long) 8
sizeof(float) 4
sizeof(double) 8
sizeof(long double) 16
sizeof(int*) 8
sizeof('a') 4
sizeof(1) 4
sizeof(1.0f) 4
sizeof(1.0) 8
sizeof "abc" 4
其中sizeof('a') 4有点奇怪哈。

当操作数是联合类型时,sizeof是其最大字节成员的字节数。当操作数是结构类型时,sizeof是其成员类型的总字节数,包括补充字节在内。如下:

union  U
{
     char c;
     double d;
}U;

sizeof(U) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;

而sizeof结构体的时候,还要考虑对齐的问题:

struct S
{
     char c;
     double d;
}s;
在我的电脑上,sizeof(s)的大小是16。


基本上说的比较清楚了,但有些时候和函数参数相关的时候,还是要注意,比如

int calc(char a[10])
{
    printf("%d\n",sizeof(a));
    return 0;
}

int main()
{
    char a[10]={"hello"};
    calc(a);
    return 0;
}
打印的结果是8,而不是10,这个是要注意的。









 


### C语言中 `sizeof` 运算符的使用方法 #### 1. 基本概念 `sizeof` 是C语言中的一个单目操作符,用于返回操作数在内存中占用的字节数。操作数可以是一个数据类型或变量,其大小由编译器和目标平台决定[^3]。 #### 2. 使用形式 `sizeof` 的使用形式有两种: - **用于基本数据类型**:`sizeof(type)`,其中 `type` 必须用括号括住,例如 `sizeof(int)`。 - **用于变量**:`sizeof(var_name)` 或 `sizeof var_name`,变量名可以不加括号。 #### 3. 示例代码 以下是一些常见的 `sizeof` 使用示例: ```c #include <stdio.h> int main() { // 3.1 基本数据类型的大小 printf("len_int = %d, len_short = %d, len_double = %d, len_char = %d\n", sizeof(int), sizeof(short), sizeof(double), sizeof(char)); // 输出示例:len_int = 4, len_short = 2, len_double = 8, len_char = 1 [^3] // 3.2 变量的大小 int a = 10; short b = 20; double c = 9999.99; char d = 'a'; int e[3] = {1, 2, 3}; int f[] = {1, 2, 3}; char g[] = {'a', 'b', 'c'}; printf("a = %d, b = %d, c = %d, d = %d, e = %d, f = %d, g = %d\n", sizeof(a), sizeof(b), sizeof(c), sizeof(d), sizeof(e), sizeof(f), sizeof(g)); // 输出示例:a = 4, b = 2, c = 8, d = 1, e = 12, f = 12, g = 3 [^3] return 0; } ``` #### 4. 高级应用 - **结构体中的 `sizeof`**:`sizeof` 可以用于计算结构体的总大小,但需要注意结构体对齐的影响[^2]。 - **数组中的 `sizeof`**:对于固定大小的数组,`sizeof` 返回整个数组占用的字节数。例如,`int arr[5]; sizeof(arr)` 将返回 `5 * sizeof(int)`。 #### 5. 注意事项 - `sizeof` 在编译时计算,因此无法用于动态分配的内存。 - 对于指针变量,`sizeof` 返回的是指针本身的大小,而不是它指向的数据的大小[^3]。 ```c int *ptr = NULL; printf("Size of pointer: %zu\n", sizeof(ptr)); // 输出指针大小,通常为4或8字节 ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值