C:sizeof运算符的一个陷阱
admin
2024-01-18 06:37:21
0

sizeof运算符通常用于获取变量或类型所占内存的大小(单位是字节)

#include struct D{char a;int b;
};int main()
{int a = 0;struct D d;printf("sizeof(a)=%ld\n", sizeof(a));printf("sizeof(int)=%ld\n", sizeof(int));printf("sizeof(d)=%ld\n", sizeof(d));printf("sizeof(struct D)=%ld\n", sizeof(struct D));return 0;
}

运行程序输出:

sizeof(a)=4
sizeof(int)=4
sizeof(d)=8
sizeof(struct D)=8

使用此特性可以结合memset,对数据结构进行初始化:

#include 
#include struct D{char a;int b;
};int main()
{D d;printf("before init:a=%d, b=%d\n", d.a, d.b);memset(&d, 0, sizeof(d));printf("after init:a=%d, b=%d\n", d.a, d.b);return 0;
}

运行程序输出:

before init:a=16, b=0
after init:a=0, b=0

不过在使用sizeof时需要注意,对于指针类型的变量,只会求值指针的大小,不会求值其指向内容的大小:

#include int main()
{char str[10] = {0};char* pStr = str;printf("sizeof(str)=%ld\n", sizeof(str));printf("sizeof(pStr)=%ld\n", sizeof(pStr));return 0;
}

运行程序输出:

sizeof(str)=10
sizeof(pStr)=8

这对于通过函数参数进行sizeof求值是一个陷阱:

#include 
#include void f(char *pStr)
{memset(pStr, 'a', sizeof(pStr));printf("pStr:%s sizeof(pStr)=%ld\n", pStr, sizeof(pStr));
}int main()
{char str[10] = "123456789";printf("str:%s sizeof(str)=%ld\n", str, sizeof(str));f(str);return 0;
}

运行程序输出:

str:123456789 sizeof(str)=10
pStr:aaaaaaaa9 sizeof(pStr)=8

可见,在函数f内,通过指针pStr求值sizeof,获得的是指针的大小(64位系统上位8个字节),如果依据此指来初始化str,那么只能操作8个字节,也就导致了调用函数f后,str进入了一种混乱的状态,其内容为:aaaaaaaa9

相关内容

热门资讯

热点推荐“津乐天津麻将到底有没... 津乐天津麻将这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这...
热点推荐“富贵川麻换三张到底有... 您好:富贵川麻换三张确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌...
热点推荐“火龙棋牌到底有没有透... 亲,火龙棋牌这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,火龙棋牌的开挂软件,名...
热点推荐“仁乐棋牌到底有没有透... 热点推荐“仁乐棋牌到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能...
热点推荐“秀山搏胡到底有没有透... 热点推荐“秀山搏胡到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的a...
热点推荐“开心在线到底有没有透... 热点推荐“开心在线到底有没有透视挂吗”原来真的有挂;原来确实真的有挂(需添加指定薇7198902获取...
热点推荐“全民娱乐到底有没有透... 您好:全民娱乐确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发...
热点推荐“湘叶娱乐到底有没有透... 热点推荐“湘叶娱乐到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的a...
热点推荐“大圣到底有没有透视挂... 您好:大圣确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发现很...
热点推荐“天天川麻到底有没有透... 您好:天天川麻确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发...
热点推荐“亲友茶苑到底有没有透... 亲友茶苑这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这款游...
热点推荐“天福广西麻将到底有没... 您好:天福广西麻将确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都...
热点推荐“大金牙麻将到底有没有... 热点推荐“大金牙麻将到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就...
热点推荐“斗棋红中到底有没有透... 斗棋红中这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这款游...
热点推荐“游宝内蒙麻将到底有没... 热点推荐“游宝内蒙麻将到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下...
热点推荐“贝众乐游到底有没有透... 热点推荐“贝众乐游到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的a...
热点推荐“88娱乐城到底有没有... 热点推荐“88娱乐城到底有没有透视挂吗”原来真的有挂;原来确实真的有挂(需添加指定薇7198902获...
热点推荐“传奇德州到底有没有透... 您好,传奇德州这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
热点推荐“精品乐清麻将到底有没... 热点推荐“精品乐清麻将到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”...
热点推荐“湘叶娱乐到底有没有透... 热点推荐“湘叶娱乐到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能...