对sizeof的思考
一.sizeof的特点(与strlen比较)
1.sizeof是运算符,strlen是函数,这意味着编译程序在编译的时候就把sizeof计算过了,所以sizeof(x)可以用来定义数组维数。
例如
int arr[sizeof(int)];//相当于int arr[4];
2.sizeof能够返回变量或类型所占的字节空间大小,而strlen只能够返回字符串的大小,即字符串必须以'\0'结尾。
]="; int a=strlen(str); //a=10;得到的是字符串的长度 int b=sizeof(str); //而b=20;得到的是数组的长度
二.sizeof计算不同类型的值的大小
1.变量
sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
可以按以下几种变量类型分类:
a.对基本数据类型的变量,取得的是数据类型的大小
b.对结构体类型的变量,取得的是结构体变量所占空间的大小。这其中涉及到字节对齐的问题。
c.对数组类型的变量,取得的是数组的大小,并不是数组元素的个数,例如:
]; *;而不是等于3.
d.对指针类型(包括函数指针)的变量,取得的是指针的大小,即机器字长大小。
e.对解引用指针,返回指针所指向的对象的大小,指针不需要有效。
f.对数组形参,与指针相同返回的是指针的大小,因为c语言中并不传递数组的每个元素值,只是将数组的首地址传给函数。例如
2.基本的数据类型
得到的是基本类型的大小。
三.其他
char const *static_string = "Hello"; //sizeof(static_string)是sizeof一个指针,所以在32bitsystem是4 char stack_string[] = "Hello"; //sizeof(stack_string)是sizeof一个数组,所以是6*sizeof(char) ]; strncpy("); //sizeof(string)是sizeof一个指针,所以还是4。 //和第一个不同的是,这个指针指向了动态存储区而不是静态存储区。
struct test{ int a, b, c, d, e, f, g, h; }; int main(){ test& r = *newtest; cout<< cout<<sizeofr<<endl;//也是32 }
r 引用的是整个的 test 对象而不是指向 test 的指针,所以 sizeof r 的结果和 sizeof test 完全相同。
对sizeof的思考的更多相关文章
- 数据结构(C语言版)顺序栈相关算法的代码实现
这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...
- C语言中的sizeof()
sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着"辛苦我一个,幸福千万人"的伟大思想,我决定将其尽可能详细的总结一下. 但当我总结的时候才发现,这个 ...
- 数组的sizeof
数组的sizeof值等于数组所占用的内存字节数,如: char a1[] = "abc"; int a2[3]; sizeof( a1 ); // 结果为4,字符 末尾还存在 ...
- 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)
一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...
- 关于《加密与解密》的读后感----对dump脱壳的一点思考
偶然翻了一下手机日历,原来今天是夏至啊,时间过的真快.ISCC的比赛已经持续了2个多月了,我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦,但感觉还是很幸运的,能在大三的时候遇到ISCC, ...
- sizeof进行结构体大小的判断
typedef struct{ int a; char b;}A_t;typedef struct{ int a; char b; char c;}B_t;typedef ...
- 解决一道leetcode算法题的曲折过程及引发的思考
写在前面 本题实际解题过程是 从 40秒 --> 24秒 -->1.5秒 --> 715ms --> 320ms --> 48ms --> 36ms --> ...
- (转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考
昨天去面试一家公司,面试题中有一个题,自己没弄清楚,先记录如下: class D { public: void printA() { cout<<"printA"< ...
- 关于Linux系统basename函数缺陷的思考
某模块作为前台进程独立运行时,运行命令携带命令行参数:作为某平台下守护进程子进程运行时,需要将命令行参数固化在代码里.类似如下写法: char *argv[] = {"./DslDriver ...
随机推荐
- 使用PHP flush 函数的时候我们需要注意些什么呢?
WebServer(可以认为特指apache)的缓冲区.在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针,间接的调用apache的api: ...
- mysql语句
查询字段长度:SELECT MAX(LENGTH(pd)) FROM `table` where id=2;来检查当前表中字段的字符集设置.show full fields from tableNam ...
- HDU 1024:Max Sum Plus Plus(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Problem Description Now I think you ...
- destoon 深度整合discuz x2 UC 之免邮箱二次验证
destoon中member/my.php,信息发布入口处判断是否已在dx中做了验证,如果已经验证,则不再提示验证,否则其中dt的验证页面. 在home.php.php. group.php. for ...
- 将turnserver设定成开机启动
1.创建一个文件,在目录/etc/init/下面 #sudo vim /etc/init/turnserver.conf 2.添加如下内容 description "turn server& ...
- hdu5514Frogs(2015ACM-ICPC沈阳赛区F题)
这题很容易转化到一个容斥计数问题.而用指数复杂度的枚举计数法显然会挂,只能考虑别的方法. 首先将a[i]用gcd(a[i], m)替换,排序去重后得到一组m的约数,而m不超过1e9,因此m的所有约数最 ...
- 修改Windows下的键盘映射
在知乎上看见有人说Ctrl键放在A的旁边会更方便,于是我就琢磨着把Cap Lock键改成Ctrl 我肯定不愿意用第三方工具修改的,于是找到了这篇文章,很容易的就修改成功,现在用起来果然舒服多了. 附上 ...
- PostgreSql安装
官网:http://www.postgresql.org/download/linux/redhat/ 一.安装 由于我的机子是centos6.2,所以选择RedHat的. 按照官网所说的进行安装: ...
- STM32/GD32上内存堆栈溢出探测研究
无数次遭受堆栈溢出折磨,随着系统变得复杂,故障点越来越难以查找!主要溢出情况如下:1,一般RAM最后两块空间是堆Heap和栈Stack,堆从下往上用,栈从上往下用,任意一个用完,都会进入对方的空间2, ...
- js 10秒钟倒计时
第一个: <html> <head> <meta http-equiv="Content-Type" content="text/html; ...