C语言中 sizeof 运算的值是在编译时还是运行时确定的?

在经典的《C语言程序设计》书中说到:

C语言提供了一个编译时(compile-time) 一元运算符 sizeof,它可以用来计算任一对象的长度。 表达式

sizeof 对象

以及

sizeof(类型名)

将返回一个整型值,它等于指定对象或类型占用的存储空间字节数。

当然这里显然得到结论 sizeof 的值是在编译时确定的, 可是在C99标准前这是毫无疑问的,但是C99标准引入了动态数组,比如下列代码:
// 需在C99标准的编译器下编译, ANSI C (即C89)下编译不通过

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
 int n;
 scanf("%d",&n);
 int arr[n];
 printf("%d\n",sizeof(n++));
 printf("%d\n",sizeof(arr));
 printf("%d",n);
 return 0;
}

上述代码开始输入 3 给 n

输出结果为:

4 12 3

即sizeof(n++)中的++未执行,(在sizeof后使用函数,同样在求函数返回值大小时,函数也不会执行)

但sizeof(arr) 一定不是在编译时确定的。 不同的输入得到动态数组大小不一;

所以觉得:

在c99没有出现之前,sizeof是由编译时确定的,

sizof对一个类型求出的值可以当一个常量来用。 但,c99中引入了动态数组(定义一个数组,其大小由运行时确定) 导致sizeof作用于动态数组时的值不再是常量

ps: sizeof(‘a’)在C语言中的结果是4,在C++中结果是1,看过某篇文章说C中sizeof侧重于“数”,而C++中sizeof更侧重于“字符”。

两个用宏实现sizeof的经典应用

//适用于非数组

#define _sizeof(T) ((size_t)((T*)0 + 1))

//适用于数组

#define array_sizeof(T) ((size_t)(&T+1)-(size_t)(&T))

对于非数组的宏定义,先是将0转换为T*类型的指针所指向的地址(此时地址为0)。然后对T类型的地址加1,相当于加上了T类型的大小(即得到了非数组T的大小)。前面的size_t只是将地址转化为int型的整数返回。 一个简单的例子:int* p; p=p+1; ——–p是一个int*类型的指针, p+1在地址空间上相当于加上了4个字节。

对于数组的宏定义,类似于非数组的宏定义,为了方便理解,这里可以把数组T看成一个用户自定义的类型,&T表示数组类型的指针,对于数组类型指针加1相当于在地址上加上了该数组大小。由于是用户自定义的类型所以不能强制将0转化为数组类型的地址,只能用加1后的地址减去之前的地址,得到的差值就是数组本身所占的字节大小。

原文链接



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在C语言sizeof函数可以用来计算一个数据类型或变量所占用的字节数。它可以作用于各种数据类型,包括基本数据类型(如int,float等),结构体,数组等等。使用sizeof函数可以方便地确定某个数据类型或变量所占用的内存大小,以便在程序合理地分配内存空间。同sizeof函数也可以用于计算数组的长度,例如sizeof(array)/sizeof(array[0])可以得到数组元素的个数。 ### 回答2: 在C语言sizeof是一个特殊的操作符,用于返回数据类型或变量所占用的内存空间大小(以字节为单位)。 sizeof函数的主要作用有以下几点: 1. 确定数据类型的字节大小:sizeof可以返回数据类型的字节大小,例如sizeof(int)返回4,表示int类型占用4个字节的内存空间。这对于我们在计算内存分配、数组长度等方面非常有用。 2. 获取变量的字节大小:sizeof可以返回变量所占用的内存空间大小。例如,如果有一个整型变量x,可以使用sizeof(x)来获取x所占用的字节大小。 3. 计算数组长度:由于数组在内存是按连续方式存储的,sizeof可以用于计算数组的长度,即数组元素的个数乘以每个元素的大小。例如,如果有一个整型数组a,可以使用sizeof(a)/sizeof(a[0])来计算数组的长度。 4. 判断指针类型:sizeof可以用于确定指针的类型。例如,sizeof(int*)返回指向int类型的指针的大小。 需要注意的是,sizeof是一个在编译运算的操作符,不会实际改变程序的运行。另外,在一些情况下,sizeof可能会返回一个无法真正代表实际大小的结果,例如当应用于动态分配的内存或指向函数的指针。 总而言之,sizeofC语言的作用是用于返回数据类型或变量所占用的内存空间大小,方便我们在内存分配、数组长度计算等方面做出正确的决策。 ### 回答3: 在C语言sizeof函数是一个运算符,用于计算数据类型或变量所占用的内存大小,以字节为单位。 sizeof函数的作用主要有以下几点: 1. 获取数据类型的大小:可以用sizeof函数来确定数据类型所占用的内存大小。例如,sizeof(int)可以得到int类型的大小,通常为4字节。 2. 获取变量的大小:可以用sizeof函数来获取一个变量所占用的内存大小。例如,sizeof(num)可以得到变量num的大小,取决于其类型。 3. 计算数组元素个数:可以利用sizeof函数计算数组元素的个数。例如,对于int数组arr,可以使用sizeof(arr)/sizeof(int)来得到数组的长度。 4. 计算结构体的大小:可以使用sizeof函数来获取结构体所占用的内存大小。例如,sizeof(struct Student)可以得到结构体Student所占用的内存大小。 需要注意的是,sizeof函数返回的是一个常数,表示所占用的字节数。另外,sizeof函数在编译计算,不会对数据类型或变量进行实际的评估或操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值