当前位置:首页 > 数据库 > 正文

c语言sizeof(c语言sizeof怎么计算字节数)

c语言sizeof(c语言sizeof怎么计算字节数)

其实c语言sizeof的问题并不复杂,但是又很多的朋友都不太了解c语言sizeof怎么计算字节数,因此呢,今天小编就来为大家分享c语言sizeof的一些知识,希望可以帮...

其实c语言sizeof的问题并不复杂,但是又很多的朋友都不太了解c语言sizeof怎么计算字节数,因此呢,今天小编就来为大家分享c语言sizeof的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

C语言中的sizeof关键字能够计算数组长度吗老师说有陷阱是什么意思

谢邀。

在C语言程序开发中,sizeof()是一个常用,也是一个非常有用的关键字,程序员常常使用它来获取变量占用内存的字节数。

称sizeof()为“关键字”,是因为虽然sizeof()使用起来很像一个函数,但是它与函数还是有很大区别的,这一点我之前的文章讨论过。

小技巧:避免“硬解码”造成的代码维护困难

例如下面这样的例子,请看相关C语言代码如下:

size就等于x在内存中占用的字节数。在固定的机器平台,变量x是float类型,占用的内存字节数是固定的,例如float类型在pc上常占用4字节内存空间。

之所以不直接使用4,而是使用sizeof(x)是为了方便以后的维护。可以想象,若以后发现x需要使用更长的数据类型double才能满足需求,只需将floatx;修改为doublex;就可以了,size会自己适应修改。

其实不仅C语言,在其他语言的程序开发中,都有这样一个原则:尽可能的避免硬解码出现,尽可能的避免重复功能出现,这样才有利于后期的维护——万一需要修改代码,只需要修改一处。

sizeof()获取数组长度的“陷阱”

很多时候,利用sizeof()还可以获取数组的长度,例如下面这两行C语言代码:

len此时等于128,也即数组str的长度。但是如果数组不是char型的,而是其他类型的,len还等于数组长度吗?编写如下C语言程序:

编译并执行这段C语言代码,得到如下结果:

显然,len并不等于arr的长度10,而是等于40。很多C语言初学者看到这里会感到迷惑,怎么回事?sizeof(数组名)不是等于数组长度的吗?

sizeof()关键字从来就不是计算长度的关键字,而是获取变量占内存空间字节数的关键字,这一点要谨记。str是一个长度为128的char型数组,它占用内存字节数恰好等于128,是因为str的每一个元素都是char型的,而char型占用一个字节的内存空间,因此此时str占用内存字节数和它的长度恰好是相等的。

再来看数组arr,它的长度等于10,但是它的每个元素都是int型的,而在我的机器上int型变量占用4字节内存空间,所以arr一共占用40字节内存空间,因此sizeof(arr)等于40,而不是10。

获取数组长度的小技巧

现在知道sizeof()有时无法直接获取数组长度的原因了,我们完全可以如下定义一个方法,用于计算数组长度,相关C语言代码如下,请看:

sizeof(数组名)计算的是整个数组占用的内存字节数,而sizeof(*x)等价于sizeof(x[0]),也即数组第一个元素占用的内存字节数。因为数组中各个元素的类型是相同的,所以sizeof(*x)也可以认为是每一个数组元素占用的内存字节数。上述宏定义就相当于:

数组长度=数组所有元素占用内存字节数/每个元素占用内存字节数

这么看来,arr_len就不难理解了。编写如下C语言程序测试一下arr_len:

编译并执行上面这段C语言程序,得到如下输出:

显然,arr_len计算其他类型数组的长度也不在话下。

C语言sizeof,以及如加法+的多态,在编译阶段到底如何实现

sizeof和+实现的对不同类型数据的处理不叫多态,多态是针对对象(数据和函数的封装)而言的。在编译阶段,进行变量跟踪的时候遇到这些符号会自动将其转换为相应的方法。sizeof只是查询了编译阶段创建的变量列表。

在C/C++中,什么时候会用到sizeof

sizeof程序员笔试中常考题目,看似简单的指令,其中埋了很多雷,要多注意以防伤及吾身。

sizeof:判断数据类型长度符的关键词。

数组

charp[10]=“abcde”;

printf(“%d”,sizeof(p));

10

因为p是一个数组,含有10个char类型数据,所以返回10。

指针

char*p1=newchar[10];

strcpy_s(p1,10,“abcde”);

printf(“%d”,sizeof(p1));

4

指针存放的是地址,由于32位机器的地址只要4个字节就可以表示了,所以指针的大小都是4。

字符串

chara1[]=“abcde”;

chara2[]={'a','b','c','d','e'};

a1的sizeof返回6

a2的sizeof返回5

因为a1是字符串常量,会以“\0”结尾。

static变量

classA

public:

staticinta;

Intb;

}

sizeof(A)为4,因为stfatic属于存在静态存储区,只会统计b的大小。

函数

classA0

public:

voidadd(){};

sizeof返回1,空类的大小都为1。

classA0

public:

inti;

Voidadd(){};

}

返回4,int的数据长度。

虚函数

classA1

public:

virtualvoidadd(){};

返回4,虚函数的指针为4。

字节对齐

需要满足三条准则:

1、结构体变量的首地址能够被其最宽的基本类型成员的大小所整除;

2.结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;

3.结构体的总大小为结构体的最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加入填充字节。

structEx1

shorts1;

inti1;

charc1;

sizeof为12,2+2+4+1+3=12。

第二个2和最后一个3分别基于上述2、3准则添加。

structex2

{

charc1;

Shorts1;

Inti1;

}

sizeof值为8;1+1+2+4=8

sizeof运算符的功能是获取某一数据或数据类型在内存中所占的字节数这句话是对的嘛

sizeof运算符的功能是获取某一数据或数据类型在内存中所占的字节数这句话是对的。

sizeof在Pascal语言中,sizeof()是一种内存容量度量函数,功能是返回一个变量或者类型的大小(以字节为单位);在C语言中,sizeof()是一个判断数据类型或者表达式长度的运算符。

在Pascal语言与C语言中,对sizeof()的处理都是在编译阶段进行。

sizeof函数的用法例子

1.首先,我们需要在visualstudio2017上新建一个c语言项目,点击打开即可。

2.在c语言源代码中,我们需要加入头文件,使用sizeof函数不需要加入math.h头文件,添加stdio.h即可。

3.我们定义一个整型int数据,然后调用sizeof函数即可获得int数据类型大小。

4.编译并运行项目后,我们可以看到当前平台下int整型数据的大小为4,点击即可查看。

C语言中sizeof(double)是

double是双精度浮点数,比float能表示小数点儿后更多的位。可以语法上可以不一样,malloc的参数是分配置内存的大小,你写个240代替30*sizeof(double)也是可以的,但是不直观。返回值是void*,前面的(double*)是强制类型转换,应该是要赋值给一个double*的变量。

文章分享结束,c语言sizeof和c语言sizeof怎么计算字节数的答案你都知道了吗?欢迎再次光临本站哦!

最新文章