-
2022-02-10 10:14:33
一.一般类型
约定为32位系统,即char 1字节、short 2字节、int 4字节,指针是地址4个字节
定义:偏移量
偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小
struct note
{
int a;----0偏移量
char b;----4+0偏移量
short c;----1+4偏移量,但要是short的整数倍,所以得补1位
}note1;
sizeof(note1) = 2(short长度) + 6(偏移量) = 8;
二.内嵌结构体
struct note
{
char a;----0偏移量
struct date
{
short c;----1+0偏移量,但要是int d整数倍,所以得补3,偏移量就是4
int d;----2+4偏移量,不是int的整数倍,得补2,偏移量就是8
}date1;
short e;----4+8偏移量,不用补,是short的整数倍
}note1;
sizeof(note1) = 2+12=14,由于14不是int的整数倍,得补2,所以是16
三.如果指定了对齐值
#pragma pack(1)
struct A{
char a; //0
int b;//1+0
short c;4+1
};sizeof(A) = 2+4+1=7
#pragma pack(1)
struct B{
char a;//0
short b;//1+0
int c;//2+1
};sizeof(B) = 4+2+1=7
四.结构体有指针
struct C
{
char a;----0偏移量
char *b;----1+0偏移量
int c;----4+1偏移量,由于不是int整数倍,得补3,偏移值就是8
short d;----4+8
int *e;----2+12=14不是int整数倍,得补2,偏移量就是16
}
sizeof(C) = 4+16=20
更多相关内容 -
C语言sizeof的用法及注意事项
2022-03-06 13:29:46C语言sizeof的用法及注意事项C语言sizeof的用法及注意事项
求普通变量的大小
#include <stdio.h> int main() { int a = 5; printf ("%d\n", sizeof(a)); //4 计算a所占空间的大小,单位是字节 printf ("%d\n", sizeof (int)); //4 计算int类型的大小 printf ("%d\n", sizeof a); //4 可以省略括号,说明sizeof是一个操作符,不是函数 return 0; }
求数组的大小
#include <stdio.h> int main() { int arr[10]= { 0 }; printf ("%d\n" , sizeof(arr)); //40,单位是字节 printf ("%d\n", sizeof(int[10])); //40, int[10]是arr数组的类型 return 0; }
特殊例子:
#include <stdio.h> int main() { short s =5; int a = 10; printf ( "%d \n", sizeof(s = a + 2)); //结果为:2 printf ( "%d \n", s); //结果为:5 return 0; }
解释:因为sizeof括号中的表达式是不参与运算的! 源文件在变成可执行文件过程中,经过预处理,编译,汇编,链接,sizeof在编译中就判断了s的大小,给出值为2,并且表达式不参与运算,而printf函数是在运行的时候再执行的,所以直接打印出2,和下面s变量的值5
sizeof计算指针
#include <stdio.h> void test1(int arr[]) { printf("%d\n",sizeof(arr)); // 4/8 -> 指针的大小 } void test2(char ch[]) { printf("%d\n",sizeof(ch)); // 4/8 -> 指针的大小 } int main() { int arr[10] = {0}; char ch[10] = {0}; printf("%d\n", sizeof(arr)); //40 printf("%d\n", sizeof(ch)); //10 test1(arr); test2(ch); return 0; }
用sizeof求数组大小时要注意,当数组被当作参数传递过去时,传过去的是数组的首元素的地址,因为是地址,所以用指针来接收,所以函数里面用sizeof求的都是指针的大小,不是数组,32位平台下都是4字节,64位平台下都是8字节
strlen与sizeof的区别
strlen -函数:求字符串长度的,找’\0’之前出现的字符个数
sizeof -操作符:算变量/类型所占内存大小,单位是字节
sizeof的返回类型
#include <stdio.h> int i; //i是全局变量,不初始化,默认是0 int main () { i--; //-1 if (i > sizeof(i)) { printf ( "> \n" ); } else { printf ("<\n"); } return 0; }
这个例子的输出结果是>,sizeof这个操作符,算出的结果的类型是unsigned int,因为大小是没有负数的,当进行 i > sizeof(i) 比较时,会把有符号的 i 算术转换为无符号,因为-1在内存中全1存储,变为无符号后原码补码一样,将会是一个很大的数,肯定比4字节大,所以输出>
-
C语言sizeof与数组中的使用详解
2022-04-13 15:56:49C语言sizeof与数组中的使用详解提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、sizeof常见的使用方法:
示例:
int a=10;int arr=[1,2,3,4,5];
char str[]=“hello,c”; //这里面还有‘/0’大家不要忘记!!!
printf(“a=%d,arr=%d,str=%d\n”,a,arr,str)
结果是:a=4,arr=24,str=8
二、sizeof在数组的使用详解:
代码如下(示例):
#include <stdio.h> int main() { int a[] = { 1,2,3,4 }; printf("%d\n", sizeof(a));//16 printf("%d\n", sizeof(a+0)); // 4/8 a+0是第一个元素的地址 sizeof(a+0)计算地址大小 printf("%d\n", sizeof(*a)); //4 *a是数组第一个元素的,sizeof(*a)计算第一个元素大小 printf("%d\n", sizeof(a+1)); //4/8 a+1是第二个元素的地址,sizof(a+1)计算的是地址的大小 printf("%d\n", sizeof(a[1])); //4 计算的的是第二个元素的大小 printf("%d\n", sizeof(&a)); //4/8 &a虽然数组的地址,但是也是地址,所以计算的是地址的大小 printf("%d\n", sizeof(*&a)); //16 &a——int(*p)[4]=&a;数组指针 *&可以理解为相互抵消了 //a单独放在sizeof中计算的是数组的大小 printf("%d\n", sizeof(&a+1)); //4/8 &a+1是数组后面空间的地址 是地址那么就是4/8 printf("%d\n", sizeof(&a[0])); //4/8 &a[0]第一个元素地址 printf("%d\n", sizeof(&a[0]+1)); // 4/8 &a[0]+1第二个元素的地址 return 0; }
总结
1.sizeof(数组名)——数组名表示整个数组,计算的是整个数组的大小。
2.&数组名——数组名表示整个数组,取出的也是整个数组的大小。
(除此之外所有的数组名都是数组首元素的的地址) -
C语言Sizeof()
2020-03-29 21:57:07C语言数据类型C语言数据类型sizeof运算快捷键有助于目录的生成文本的样式链接与图片插入一段漂亮的代码片生成一个列表创建表格Pants创建一个列表创建一个注脚注释甘特图功能,丰富你的文章图表流程图导入出入 C语言...C语言数据类型
C语言中在使用一个变量前需要对变量进行声明,声明的同时要确定变量的数据类型。C语言中的数据类型有:
- char、 short、 int、 long、 long long
- float、double、long double
- bool
- 指针
- 自定义类型
其中,整型变量在内存中以二进制(补码)的形式存储,浮点型以编码的形式存储。所以整型数据可以直接使用加法器进行运算,而浮点型不可以直接使用加法器进行运算。
sizeof运算
1 、sizeof是C语言中的一个运算符,用来计算某个数据类型或某个变量在内存中占用的字节数(byte),如:
- sizeof(int); //sizeof(数据类型)
- sizeof(price); //sizeof(变量)
在C语言中,对sizeof()的处理是在编译阶段完成的,即在编译结束后sizeof()的结果就已经确定了。
int a; a = 6; printf("sizeof(a) = %ld\n", sizeof(a++)); printf("sizeof(int) = %ld\n", sizeof(int)); printf("a = %ld\n", a);
运行结果:
sizeof(a) = 4 sizeof(int) = 4 a = 6
变量a的值并没有加1,那是因为sizeof(a++)在编译阶段就已经确定结果了,a++根本就没有执行。
2 、sizeof计算变量占用内存的大小其实是计算该变量数据类型的大小。即同种数据类型的不同变量,它们的sizeof值都是一致的。
int a,b; a = 6; b = 18; printf("sizeof(a) = %ld\n", sizeof(a)); printf("sizeof(b) = %ld\n", sizeof(b));
运行结果:
sizeof(a) = 4 sizeof(b) = 4
3 、sizeof对一个表达式求值,编译器根据表达式的最终结果的数据类型来确定大小,但是一般不会对表达式进行计算。如:
printf("sizeof(a) = %ld\n", sizeof(a)); printf("sizeof(b + 0.3) = %ld\n", sizeof(b + 0.3));
运行结果:
sizeof(a) = 4 sizeof(b + 0.3) = 8
因为b + 0.3之后变成一个double数据类型,所以其大小为8个字节。
4 、sizeof也可以对一个被调函数求值,其结果是函数返回类型的大小,但函数并不会被真正调用,即函数不会被执行。
double add(int *temp) { (*temp)++; return 0.5; } int main() { int a,b; a = 6; b = 18; printf("sizeof(a) = %ld\n", sizeof(add(&a))); printf("a = %ld\n", a); }
运行结果:
sizeof(a) = 8 a = 6
变量a的值并没有加1,那是因为函数根本就没有执行。且sizeof的计算大小是8,它是根据函数返回值类型double来计算大小的。
5 、sizeof()计算指针类型时,与指针所指向的对象没有关系,所有指针变量的大小都是一样的,所以很多形参都使用指针类型。
char*pc="abc"; int *pi; double *ps; char **ppc = &pc; void(*pf)();//函数指针 printf("%ld\n", sizeof(pc)); printf("%ld\n", sizeof(pi)); printf("%ld\n", sizeof(ps)); printf("%ld\n", sizeof(ppc)); printf("%ld\n", sizeof(pf));
运行结果:
4 4 4 4 4
从结果可以看出指针变量占用内存都是一样的,与指向对象没有关系。
6 、sizeof()计算数组内存时,计算的是整个数组所占用的内存大小,与数组类型和数据长度等相关。
char a[] = "abc"; int b[3]; printf("sizeof(a) = %ld\n", sizeof(a)); printf("sizeof(b) = %ld\n", sizeof(b));
运行结果:
sizeof(a) = 4 sizeof(b) = 12
字符数组a的大小之所以是4而不是3,原因在于数组末尾有个隐藏的停止符。数组b为整型数组,一个组员是4个字节,3个组员共占12个字节。
7、当数组作为函数形参时,数组会退化为指针,其占用的内存大小为一个指针的大小。
void foo3(char a3[]) { printf("sizeof(a3) = %ld\n", sizeof(a3)); } void foo4(int a4[]) { printf("sizeof(a4) = %ld\n", sizeof(a4)); } int main() { char a[] = "abc"; int b[] = {1, 2, 3, 4}; foo3(a); foo4(b); }
运行结果:
sizeof(a3) = 4 sizeof(a4) = 4
8 、sizeof()计算结构体变量或类型的大小时,因为结构体存在数据对齐,所以其大小会因为结构体成员的顺序不同而不同。
typedef struct { char a[2]; int b[4]; char c; } Data; int main() { Data test1; printf("sizeof(test1) = %ld\n", sizeof(test1)); }
运行结果:
sizeof(test1) = 24
因为结构体要以最宽的数据类型来对齐内存,结构体Data中,最宽的数据类型是int,所以所有数据都要按照int类型对齐。字符数组不足4个字节就按4个字节算,字符c不足4个字节也按4个字节算。所以总大小是6*4=24个字节。
当把字符变量c放到整型数组b上面时,结果又不相同,如下所示:
#include <stdio.h> typedef struct { char a[2]; char c; int b[4]; } Data; int main() { Data test1; printf("sizeof(test1) = %ld\n", sizeof(test1)); }
运行结果:
sizeof(test1) = 20
因为字符数组a和字符c总和都不到一个字节,所以两个变量作为一个整型来对齐,占4个字节。
9 、sizeof()计算共用体变量或类型的大小时,其大小与共用体变量宽度最大的成员的大小一致。
typedef union { char a[2]; char c; int b[4]; } Data; int main() { Data test1; printf("sizeof(test1) = %ld\n", sizeof(test1)); }
运行结果:
sizeof(test1) = 16
在共用体Data中,宽度最宽的成员变量是整型数组a,占16个字节,所以共用体的占用内存也是16个字节。
10 、sizeof()表达式可以作为常量使用,以下语句是合法的:
char ary[sizeof(int)*10];
11 、sizeof()计算的是变量的实际内存大小而不是变量的长度,但是常被用来计算数组变量的长度,如下所示:
int a[] = {4, 6, 9, 19, 20}; printf("length of a is = %ld\n", sizeof(a) / sizeof(a[0]));
运行结果:
length of a is = 5
-
C语言sizeof求结构体数组长度
2021-05-19 11:36:57C语言sizeof求结构体数组长度C语言sizeof求结构体数组长度#include typedef struct ss{char a;//偏移量为0,大小为1,0能被1整除,=1short b;//偏移量为1,大小为2,1不能被2整除,=1+1+2=4int c;//偏移量为4,大小为4... -
C语言sizeof问题
2022-04-23 11:22:14C语言学习中sizeof遇到的问题,对于char的数组和char *指针,得到的空间大小不同。数组和指向数组的指针得到的结果不同。 问题描述 在win64的环境下,对于str数组来说,得到的是3,指针指向该数组的时候,得到的是8... -
C语言sizeof与strlen的区别与使用
2022-04-05 13:19:47一、sizeof 1.sizeof用来计算类型或变量所占空间的大小,单位为字节。计算时包括 '\0'。('\0'算作字符串的结束标志,在使用strlen计算长度时不被计算进去) 2.两种特殊情况:sizeof(数组名) 和 &数组名,... -
C语言sizeof求结构体的大小
2020-03-30 23:49:14C语言中的构造数据类型有三种:数组、结构体和共用体。 数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数。 结构体中的成员可以是不同的数据类型,成员... -
c语言sizeof获取数据类型长度
2021-05-19 10:51:17先看代码在看说明和和结果会让人更多的更加纯粹的思考,同时减少多余词汇造成的负担,这里只通过int类型为例试验,其他类型雷同注意在使用sizeof时与你系统是32位或者64位有关系,同时和你环境中编译器有关一、代码#... -
C语言 sizeof函数详解
2018-05-17 10:10:26from:https://blog.csdn.net/wzy198852/article/details/7246836sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结... -
C语言 sizeof关键字
2020-09-22 17:19:34一、定义及特点:在C语言中,sizeof()是返回一个对象或者类型所占的内存字节数。需要注意的是sizeof是关键字,而不是函数。 在计算变量所占空间时,()可以省略;在计算类型大小时,不能省略。 sizeof int;//error... -
C语言sizeof 详解
2019-02-01 22:53:181、sizeof是C语言的一个操作符,类似于++、–等。sizeof能够告诉我们编译器为某一特定数据或者某一个类型的数据在内存中分配空间时分配的大小,大小以字节为单位。基本用法为: 1、sizeof(变量); 2、sizeof 变量; ... -
C语言sizeof用法[借鉴].pdf
2021-10-11 01:34:10C语言sizeof用法[借鉴].pdf -
C语言sizeof的计算方式
2018-04-04 22:12:11对于C语言开发人员来说,sizeof应该不陌生吧。此次我主要写的是sizeof对各变量长度的计算方式。sizeof这个函数主要是对各数据类型的长度进行计算,入参为数据类型,返回值计算结果。但由于不同OS的系统架构下,... -
c语言 sizeof详解
2017-04-25 12:46:08sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。 它并不是函数。 sizeof操作符以字节形式给出了其操作数的存储大小。 操作数可以是一个表达式或括在括号内的类型名。 操作数的存储大小由... -
C语言sizeof和strlen的区别
2022-05-24 17:20:271、sizeof是运算符,strlen是C语言标准库函数。 2、 strlen 测量的是字符串的实际长度,以’\0’ 结束,返回结果不包括’\0’ 。 3、而sizeof 测量的是字符的分配大小,它的参数可以是数组、指针、类型、对象、函数... -
C语言sizeof()函数
2022-01-20 09:57:05C语言sizeof()函数 -
C语言sizeof()中的赋值问题
2019-12-13 10:35:09C语言sizeof()中的赋值问题 #include <stdio.h> int main() { int a = 0; int b = sizeof(a = 123); printf("a = %d , b = %d \n", a, b) return 0; } 输出结果: “a = 123”这个赋值动作没有被... -
浅析C语言中的sizeof
2020-09-05 03:33:46sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。返回值类型为size_t,在头文件stddef.h中定义 -
解析C语言中的sizeof
2020-08-04 06:46:59一、sizeof的概念 ;二、sizeof的使用方法 ;三、sizeof的结果 ;四、sizeof与其他操作符的关系 ;五、sizeof的主要用途 ;六、建议 。 -
C语言sizeof用法
2021-03-30 23:10:21使用的格式如下图所示: 为sizeof 关键字正名 sizeof是C语言的内置关键字而不是函数 在编译过程中所有的sizeof将被具体的数值所替换 程序的执行过程与sizeof 没有任何关系 得知上面这些,我们来看看下面的程序会输出... -
C语言 sizeof操作符
2021-09-21 13:07:14sizeof是c语言中的一个操作符,类似于++、–等等。sizeof能够告诉我们编译器为某一特定数据或者某一个类型的数据在内存中分配空间时分配的大小,大小以字节为单位。 基本语法: sizeof(变量); sizeof 变量; sizeof... -
C语言 sizeof(struct)讲解
2016-10-20 22:39:49struct MyStruct { double dda1; char dda; int type ...对结构MyStruct采用sizeof会出现什么结果呢?...sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13 但是当在VC中测试 -
C语言sizeof是关键字还是函数?
2015-11-06 08:18:10sizeof是关键字不是函数,就算不知道它是否为32 个关键字之一时,我们也可以借助编译器确定它的身份。来看看下面几种情况: A),sizeof(int); B),sizeof(i); C),sizeof int; D),sizeof i; 32位系统下: ... -
C语言 sizeof总结
2016-12-07 22:11:41一、sizeof用来计算一个变量,或者数据类型的长度,以字节为单位。 它是一个操作符,如同++,--一样,...C语言中的指针使其具备了强大的功能,同时也造成了许多迷惑。众多迷惑中的一点是sizeof在对待数组与指针上的差 -
C语言sizeof实例解析
2016-06-23 16:58:34C语言sizeof实例解析 首先,在这先 简单的介绍一下c语言中的sizeof运算符(它不是一个函数),隶属于头文件:#include sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在... -
c语言sizeof和strlen的使用对比区别
2019-12-01 16:06:541,sizeof举例: #include<stdio.h> int main() { char str[] = "hello word"; char str1[] = {'h','e','l','l','o'}; char *str2 = "hello word"; char str3[][20] = {"hello","word","nihao"}; //3 ... -
C语言----C语言中sizeof的用法
2022-01-05 13:53:57如下,可以查看C语言中各种基本数据类型的占用空间的大小 # include <stdio.h> # include <string.h> int main() { printf("sizeof(char): %d\n", sizeof(char)); printf("sizeof(short): %d\n", ...