彻底理解sizeof

1.sizeof是什么

很多人认为sizeof是一个函数,这是从它的用法看出来的,因为我们用的时候一般会写成sizeof(),确实像函数。但sizeof其实是操作符,返回一个对象或者类型在当前平台下所占的内存字节数。

2.具体使用

首先我们来看一个例子,注意本机使用平台为64位系统

#include<stdio.h>
int main(void)
{
    char ch[]="xiaoyuren";
    char *ptr = ch;
    
    printf("\n %d \n", sizeof(ch[1]));
    printf("\n %d \n", sizeof(ch));
    printf("\n %d \n", sizeof(*(ptr+100)));
    printf("\n %d \n", sizeof(ptr));
    
}


输出结果是
 1 

 10 

 1 

 8 



现在来逐行分析该结果:
(1)ch[1]是一个char型,char型所占的内存空间为1字节。
(2)ch指向的是整个char数组,你或许可以这样理解ch,char[10] ch(因为字符数组最后有个'\0'),所以sizeof(ch)大小是10
(3)第三条语句,第一眼一看似乎是个bug,ptr指向ch数组,那么 ptr+100 岂不是越界访问,因为ch字符数组本身大小只有10个字节。其实这并不是个bug,前面提到过sizeof是运算符,它计算的是变量或类型所占的内存空间大小,这意味着它并不需要实际访问 ptr+100 这个实际地址,而判断它是字符即可(因为ptr指向的是ch字符数组,自然认为*(ptr+100)是字符),所以输出为1毫不奇怪,后面还会讲到一些sizeof的使用误区。
(4)ptr是一个指针。指针是什么?指针表示的是一个对象在内存中的地址。既然是地址,必然要和操作系统的地址总线表示一致,而地址总线通常和字长一样。所以在32位操作系统下,一个指针必然是4个字节,而64位操作系统下是8个字节。

3.sizeof的一些使用误区

还是先来看一个例子
    int i=3;
    printf("%lu\n",sizeof(i++));
	printf("%d\n",i);
    return 0;



没错,程序输出结果是
4
3


可能会奇怪为什么语句里面的 i++ 没有执行,这又回到我们最初的定义上来了。sizeof计算的是所占用内存空间的大小,当它得知sizeof(i++)里面是一个整形变量时,也就知道了所占空间的大小,也就无需计算 i++了。从某种程度上说,这和我们上面说过的 那个 *(ptr+100)有些类似之处。

最后让我们看一个稍微复杂一点的例子。
int A(char a[10])
{ 
	return sizeof(a); 
}

int main()
{ 
	char a[10]; 
	int result = sizeof(a) * 10 + A(a) * 2;
	printf(“%d”,result); 
}



这个问题有些复杂,首先要理解数组名虽然指向的是数组的起始地址,但和指向该地址的指针还是不一样的。不一样在哪里?就如上面所说的,char a[10]理解成char[10] a; a是指向一个大小为10的数组,所以sizeof(a)就是10。但调用A()函数的时候情况有些不一样,传递参数的时候并不是作为一个数组名而是退化成了一个指针,在32位机下就是4个字节,所以答案应该就是10*10+4*2=108

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值