聊聊C语言中sizeof运算符的一个陷阱
sizeof运算符通常用于获取变量或类型所占内存的大小(单位是字节)
#include <stdio.h>
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 <stdio.h>
#include <string.h>
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 <stdio.h>
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 <stdio.h>
#include <string.h>
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
Sizeof的作用非常简单:求对象或者类型的大小。然而sizeof又非常复杂,它涉及到很多特殊情况,本篇把这些情况分门别类,总结出了sizeof的10个特性:
(0)sizeof是运算符,不是函数;
(1)sizeof不能求得void类型的长度;
(2)sizeof能求得void类型的指针的长度;
(3)sizeof能求得静态分配内存的数组的长度!
(4)sizeof不能求得动态分配的内存的大小!
(5)sizeof不能对不完整的数组求长度;
(6)当表达式作为sizeof的操作数时,它返回表达式的计算结果的类型大小,但是它不对表达式求值!
(7)sizeof可以对函数调用求大小,并且求得的大小等于返回类型的大小,但是不执行函数体!
(8)sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和!
(9)sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小!
概述:
Sizeof是C/C++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或者数据对象)的长度(即占用内存的大小,以byte为单位)。其中类型包含基本数据类型(不包括void)、用户自定义类型(结构体、类)、函数类型。数据对象是指用前面提到的类型定义的普通变量和指针变量(包含void指针)。不同类型的数据的大小在不同的平台下有所区别,但是c标准规定所有编译平台都应该保证sizeof(char)等于1。关于sizeof的更多概述你可以在msdn总输入sizeof进行查询。
总结
到此这篇关于C语言中sizeof运算符的一个陷阱的文章就介绍到这了,更多相关C语言sizeof运算符陷阱内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341