您的位置:首页 > 其它

关于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个元素。

关于结构体的测试会在后续补上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息