关于sizeof和strlen()那些年我们都迷惑过的问题
2016-11-28 18:10
316 查看
首先,使用sizeof之前,我们一定要搞清楚一个问题,那就是sizeof是一个关键字或者操作符,而不是好多人认为的所谓的函数,
sizeof任意类型的变量,都是求取这个变量所占的字节大小,注意:它求的是这个变量占空间大小的字节数。
而strlen()是一个函数,任何值作为它的参数,都会被强转为const char*类型的,它是为了求取字符串长度而产生的,这里应该注意
我们都知道字符串是以’\0’为结束标志的,字符串的长度并不包括’\0’。所以,这里可以通俗的理解strlen求取字符串长度时是在找’\0’,看到’\0’时就会停止计数。注意:它所求取的是字符串的长度。
应注意它们两者的区别,刚开始学c时,我总是傻傻分不清它们的区别,总是容易搞混,唉,往事不堪回首。
下面我会仔细分析它们求的结果为什么是这么多。
这是在32位平台下测试的。
测试1:
1.sizeof(a)——16
这里的a代表的是数组的地址,所以它所占的存储空间就是整个数组的大小,所以结果是4(元素个数)*4(每个元素的大小) = 16
2.sizeof(a+0)—-4
这里的a代表数组首元素的首地址,加0相当于第一个元素的地址,只要是地址,在32位的机器上都是占4个字节
3.sizeof(*a)—–4
不能对整个数组进行访问,而a做右值时代表数组首元素的首地址,所以解引用取得是数组的首元素—-1,所以它的大小是4
4.sizeof(a+1)—-4
这个和第二个类似,不过a+1是数组第二个元素的地址,所以也是4个字节。
5.sizeof(a[1])—-4
这个相信都可以理解,a[1]是第二个元素,因为元素的类型是int,所以它也占四个字节。
6.sizeof(&a)——4
相信很多人都会对这个产生疑问,我们都知道,&a代表的是数组的首地址,但是他也是一个地址,所以它也是占四个字节,不要认为
它代表整个数组,就是整个数组的大小。
7.sizeof(&a+1)—–4
&a+1,因为&a代表整个数组的地址,那么指针加1相当于加它所指向元素的类型的大小,所以&a+1是下一个数组的首地址,但是代表
的也是地址,所以它的大小也是4个字节。
8.sizeof(&a[0])—–4
&a[0]是数组第一个元素的地址,所以也是四个字节。
9.sizeof(&a[0]+1)—–4
&a[0]+1是数组第二个元素的地址,所以大小是四个字节。
10.sizeof(*&a)——16
*&a就相当于a,所以大小同第一个。
测试2:
分析如下:
sizeof(name[0])——1
name[0]是数组的首元素,类型为char,所以它的大小为1个字节。
2.sizeof(&name)——4
这个和上面第6个解析是一个题,所以分析可以同上。
这里的前5个都可以用上面整型数组的解析来解释
这里从第六个开始分析:
6.sizeof(name)——-7
或许有人第一眼看时,会觉得答案是6,因为有六个元素,但是这个数组里还有一个’\0’,所以数组的大小应该是7个字节
strlen就是求取字符串长度的,这里不包括’\0’,所以这个答案是6
8.strlen(&name)—–6
这里&name代表整个数组的地址,但是当它作为函数参数时,会被强转为char*,所以答案和上面的一样,
因为&name和name虽然类型不相同,但是数值是一样的,作为这个函数参数时,都会被强转为char*,所以结果相同。
9.strlen(&name+1)——随机值
&name+1是下一个数组的首地址,但是下一个数组里的内容我们并不知道,所以是个随机值。
10.strlen(name+1)—-5
name+1指的是数组第二个元素的地址,所以从此处开始计字符的个数,直到遇到’\0’停止计数,所以结果是5。
测试3:
这个需要好好分析一下,我写的重点就在这里:
首先,这里定义了一个指针变量name,还定义了一个字符串常量,这个字符串常量被保存在静态全局区。
我先画出name指针变量和字符串常量关系。
分析如下:
因为这个字符串有两种访问方式,以下标访问或者以指针访问。
1.sizeof(name[0])—-1
这个和上面的第一个分析方法一样。
2.sizeof(&name)—–4
这里的&name指的是name这个指针变量的地址,我们并不知道是多少,但是它也是一个地址,所以占四个字节。
3.sizeof(*name)——1
name就相当于*(name+0),也等同于name[0],所以它占1个字节。
4.sizeof(&name+1)—-4
&name的类型为char**,&name+1还是一个指针,所以占四个字节。
5.sizeof(name+1)—-4
name+1可以表示为指向b的一个指针,所以占四个字节。
6.sizeof(name)—–4
这里name是一个指针变量,所以占四个字节。
7.strlen(name)——-6
指针变量name保存的是a的地址,也就是字符串的首地址,所以求取字符长度为6
8.strlen(&name)—–随机值
&name是指针变量的地址,而这个值我们根本就不知道,所以求取的字符串长度是个随机值。
9.strlen(&name+1)——随机值
&name的值我们都不知道,这个更不知道,所以依然是个随机值。
10.strlen(name+1)—-5
name+1可以代表一个指向b的一个指针,从b开始向后数有5个元素。
关于结构体的测试会在后续补上。
sizeof任意类型的变量,都是求取这个变量所占的字节大小,注意:它求的是这个变量占空间大小的字节数。
而strlen()是一个函数,任何值作为它的参数,都会被强转为const char*类型的,它是为了求取字符串长度而产生的,这里应该注意
我们都知道字符串是以’\0’为结束标志的,字符串的长度并不包括’\0’。所以,这里可以通俗的理解strlen求取字符串长度时是在找’\0’,看到’\0’时就会停止计数。注意:它所求取的是字符串的长度。
应注意它们两者的区别,刚开始学c时,我总是傻傻分不清它们的区别,总是容易搞混,唉,往事不堪回首。
下面我会仔细分析它们求的结果为什么是这么多。
这是在32位平台下测试的。
测试1:
1.sizeof(a)——16
这里的a代表的是数组的地址,所以它所占的存储空间就是整个数组的大小,所以结果是4(元素个数)*4(每个元素的大小) = 16
2.sizeof(a+0)—-4
这里的a代表数组首元素的首地址,加0相当于第一个元素的地址,只要是地址,在32位的机器上都是占4个字节
3.sizeof(*a)—–4
不能对整个数组进行访问,而a做右值时代表数组首元素的首地址,所以解引用取得是数组的首元素—-1,所以它的大小是4
4.sizeof(a+1)—-4
这个和第二个类似,不过a+1是数组第二个元素的地址,所以也是4个字节。
5.sizeof(a[1])—-4
这个相信都可以理解,a[1]是第二个元素,因为元素的类型是int,所以它也占四个字节。
6.sizeof(&a)——4
相信很多人都会对这个产生疑问,我们都知道,&a代表的是数组的首地址,但是他也是一个地址,所以它也是占四个字节,不要认为
它代表整个数组,就是整个数组的大小。
7.sizeof(&a+1)—–4
&a+1,因为&a代表整个数组的地址,那么指针加1相当于加它所指向元素的类型的大小,所以&a+1是下一个数组的首地址,但是代表
的也是地址,所以它的大小也是4个字节。
8.sizeof(&a[0])—–4
&a[0]是数组第一个元素的地址,所以也是四个字节。
9.sizeof(&a[0]+1)—–4
&a[0]+1是数组第二个元素的地址,所以大小是四个字节。
10.sizeof(*&a)——16
*&a就相当于a,所以大小同第一个。
测试2:
分析如下:
sizeof(name[0])——1
name[0]是数组的首元素,类型为char,所以它的大小为1个字节。
2.sizeof(&name)——4
这个和上面第6个解析是一个题,所以分析可以同上。
这里的前5个都可以用上面整型数组的解析来解释
这里从第六个开始分析:
6.sizeof(name)——-7
或许有人第一眼看时,会觉得答案是6,因为有六个元素,但是这个数组里还有一个’\0’,所以数组的大小应该是7个字节
strlen就是求取字符串长度的,这里不包括’\0’,所以这个答案是6
8.strlen(&name)—–6
这里&name代表整个数组的地址,但是当它作为函数参数时,会被强转为char*,所以答案和上面的一样,
因为&name和name虽然类型不相同,但是数值是一样的,作为这个函数参数时,都会被强转为char*,所以结果相同。
9.strlen(&name+1)——随机值
&name+1是下一个数组的首地址,但是下一个数组里的内容我们并不知道,所以是个随机值。
10.strlen(name+1)—-5
name+1指的是数组第二个元素的地址,所以从此处开始计字符的个数,直到遇到’\0’停止计数,所以结果是5。
测试3:
这个需要好好分析一下,我写的重点就在这里:
首先,这里定义了一个指针变量name,还定义了一个字符串常量,这个字符串常量被保存在静态全局区。
我先画出name指针变量和字符串常量关系。
分析如下:
因为这个字符串有两种访问方式,以下标访问或者以指针访问。
1.sizeof(name[0])—-1
这个和上面的第一个分析方法一样。
2.sizeof(&name)—–4
这里的&name指的是name这个指针变量的地址,我们并不知道是多少,但是它也是一个地址,所以占四个字节。
3.sizeof(*name)——1
name就相当于*(name+0),也等同于name[0],所以它占1个字节。
4.sizeof(&name+1)—-4
&name的类型为char**,&name+1还是一个指针,所以占四个字节。
5.sizeof(name+1)—-4
name+1可以表示为指向b的一个指针,所以占四个字节。
6.sizeof(name)—–4
这里name是一个指针变量,所以占四个字节。
7.strlen(name)——-6
指针变量name保存的是a的地址,也就是字符串的首地址,所以求取字符长度为6
8.strlen(&name)—–随机值
&name是指针变量的地址,而这个值我们根本就不知道,所以求取的字符串长度是个随机值。
9.strlen(&name+1)——随机值
&name的值我们都不知道,这个更不知道,所以依然是个随机值。
10.strlen(name+1)—-5
name+1可以代表一个指向b的一个指针,从b开始向后数有5个元素。
关于结构体的测试会在后续补上。
相关文章推荐
- iOS开发 ----- 关于char *的赋值和字符串之间的复制问题以及sizeof strlen
- 关于数组,sizeof(),strlen的计算问题
- 发现关于数组求其长度 strlen 和 sizeof的问题
- 一道关于继承类的sizeof大小问题
- 转:struct 关于sizeof的大小-内存对齐问题
- 关于sizeof()与strlen()
- 这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
- 关于strlen和strcpy的一点问题
- 这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
- 关于 strlen 和 sizeof 、对齐 2010-01-14 16:35:58
- 关于sizeof与strlen
- 关于linux一直迷惑我的问题解决了
- 关于sizeof()和strlen()
- 关于好多继承的问题,我们应该如何去理解
- strlen() 与 sizeof() 引出的问题
- 关于strlen和sizeof的陷阱
- 这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
- 关于sizeof与strlen用法的讨论
- 关于sizeof的问题
- 关于类对象大小的 sizeof 计算问题(续)