`
javahigh1
  • 浏览: 1224391 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

深入理解sizeof

 
阅读更多

1.0 回答下列问题:[答案在文章末尾]

1. sizeof(char) =                           

2. sizeof 'a' =                           

3. sizeof "a" =                        

4. strlen("a")) =

  如果你答对了全部四道题,那么你可以不用细看下面关于sizeof的论述。如果你答错了部分题目,那么就跟着我来一起探讨关于sizeof的用法了。  

  对于前面的题目,我想一般有一定C基础的同志应该不会答错1和4题。至于第2题,我想应该要清楚sizeof是求字符串所占的内存。"a"在内存中的表现为a/0,别忘了末尾的/0也占一个字节呢。至于第2题,可能有些人会惊讶了。C 语言中,字符常数是int 型, 因此 sizeof('a') 是 sizeof(int), 这是另一个与 C++ 不同的地方。既然字符常数是int 型,那么int就可以存放4个字符,我们可以得到sizeof 'abcd'为 4。  

1.1 回答以下题目[答案在文章末尾]

short (*ptr[100])[200];

1. sizeof(ptr) =

2. sizeof(ptr[0]) =

3. sizeof(*ptr[0]) =

4. sizeof((*ptr[0])[0])) =   

  是不是又开始晕了。这里我们定义了一个100个指针数组,每个指针均指向有200个元素的数组,其内存占用为200*sizeof(short)字节。那么这100个数组指针的大小sizeof(ptr)为100*sizeof(short*)。接着,指针数组的第一个指针ptr[0]指向第一个数组,所以这个指针ptr[0]的大小实际上就是一个普通指针的大小,即sizeof(short*)。*ptr[0]指向第一个数组的起始地址,所以sizeof(*ptr[0])实际上求的是第一个组的内存大小200*sizeof(short)。(*ptr[0])[0])是第一个数组的第一个元素,因为是short型,所以这个元素的大小sizeof((*ptr[0])[0]))等价于sizeof(short)。

1.2 回答以下题目[答案在文章末尾]

#include <stdio.h>

#pragma pack(push)

#pragma pack(2)

typedef struct _fruit
{
char apple;
int banana;
short orange;
double watermelon;
unsigned int plum:5;
unsigned int peach:28;
char* tomato;
struct fruit* next;
} fruit;

#pragma pack(4)

typedef struct _fruit2
{
char apple;
int banana;
short orange;
double watermelon;
unsigned int plum:5;
unsigned int peach:28;
char* tomato;
struct fruit2* next;
} fruit2;

#pragma pack(pop)

int main(int argc, char *argv[])
{
printf("fruit=%d,fruit2=%d/n",sizeof(fruit),sizeof(fruit2));
}

问题:打印结果为什么呢?

如果你回答错误,那么你对数据结构的对齐还没有吃透。这里#pragma pack(2)强制设置编译器对齐属性为2,所以第一个数据结构以2对齐,sizeof(fruit)=(sizeof(apple)+1)+sizeof(banana)+sizeof(orange)+sizeof(watermelon)+((plum:5bit+peach:28bit+15bit)/8bit)+sizeof(tomato)+sizeof(next)(注意式子中1 和 15bit 表示补齐内存,使其以2对齐,),既sizeof(fruit)=(sizeof(char)+1)+sizeof(int)+sizeof(short)+sizeof(double)+sizeof(char*)+sizeof(struct fruit*)。第一个数据结构声明完了之后,又使用#pragma pack(4)强制设置编译器对齐属性为4,所以同理,可以得到sizeof(fruit2)=(sizeof(char)+3)+sizeof(int)+(sizeof(short)+2)+sizeof(double)+((5bit+28bit+31bit)/8bit)+sizeof(char*)+sizeof(struct fruit2*)。

注:#pragma pack(push)保存默认对齐,#pragma pack(pop)恢复默认对齐。

----------------------------------------答案:

1.0: 1,4,2,1

1.1: 400,4,400,2

1.2: fruit=30,fruit2=36

分享到:
评论

相关推荐

    深入理解Sizeof

    深入理解Sizeof

    深入理解嵌入式开发之系统开发篇全覆盖

    TP17.sizeof的用途 TP18.副作用(宏,逻辑判断)的危害 TP19. char *p; *p = malloc(10); TP20.强制转换后的数值不允许进行修改: TP21.值传递的注意事项 TP22.void*和void** TP23. char a[ ] 和 char *a 是...

    基于memset()函数的深入理解

    注意啊,可以使用sizeof(max),也可以使用 sizeof(int)*teachRelationNum,不可以直接使用 teachRelationNum,来初始化!一般情况下,可以这样使用:memset(max,0,sizeof(max));memset(max,-1,sizeof(max));memset...

    深入理解C++11:C++11新特性解析与应用

    《深入理解C++11:C++11新特性解析与应用》主要内容:国内首本全面深入解读C++11新标准的专著,由C++标准委员会代表和IBM XL编译器中国开发团队共同撰写。不仅详细阐述了C++11标准的设计原则,而且系统地讲解了C++11...

    深入理解c语言数组

    我都知道sizeof操作符可以返回一个对象或者类型所占的内存字节数。如:int i=1;那么sizeof(i) 的结果就是4(64位机器下的部分编译器是8) 那我们打印sizeof(array) printf(“%d\n”,sizeof(array)); 结果是:12。 ...

    深入理解双指针的两种用法

    好久没有用过C/C++的二级指针了,总觉的它就是指针的指针,没什么大不了的,但是今天看到一道面试题,感觉自己对二级指针的理解还是不够深刻。于是,从网上找资料,学习了一番……题目是这样的: 代码如下:#include ...

    C/C++ 传递动态内存的深入理解

    所以如果你想深入C/C++编程,你必须静下心来,好好苦一番。现在我们将讨论C/C++里我认为哪一本书都没有完全说清楚,也是涉及概念细节最多,语言中最难的技术之一的动态内存的传递。并且在软件开发中很多专业人员并不...

    经典c/c++笔试面试题汇总

    多年收集的c、c++经典书籍汇总 华为笔试面试题面试宝典 嵌入式 深入理解指针

    深入理解golang的基本类型排序与slice排序

    前言 其实golang的排序思路和C和C++有些差别。 C默认是对数组进行排序, C++是对一个序列进行排序, Go则更宽泛一些,待排序的可以是任何对象, 虽然很多情况下是... c 的 qsort 的用法: qsort(data, n, sizeof(int),

    深入理解数组指针与指针数组的区别

    也就是说执行p+1时,p要跨过n个整型数据的长度(n*sizeof(int))。如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p = a; 

    深入理解c/c++ 内存对齐

    内存对齐,memory alignment.为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。...

    程序员必备知识点整理包括编程、面试、刷题等

    13)C++析构函数为什么要为虚函数15)数组操作中对于指针的深入理解 16)、锁的理解 17) C++11 并发与多线程 18)binder通信 19)LInux 1.12 C++ 基础必备: 1)内联函数和宏定义的区别?(*****) 2)sizeof size ...

    实验报告5.doc

    实验报告5 "题目"数据类型 " "目的" " "要求"深入理解C语言中数据类型的意义。 " " " " " "测试不同类型数值数据的存储空间大小、取值范围i、有效数字位数和精度。 " " "编写一个测试基本数据类型所占内存宽度的程序...

    C语言指针的长度和类型深入分析

    对于初学者深入理解C语言程序设计有很好的参考价值。具体分析如下: 一般来说,如果考虑应用程序的兼容性和可移植性,指针的长度就是一个问题,在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,...

    C语言进阶-牟海军.pdf

    本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,...

    C语言进阶 作者 Wrestle.Wu

    本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,...

    java坑爹的笔试题-cpp-primer-5th:C++Primer第五版学习资料

    java坑爹的笔试题 cpp-primer-5th C++ ...第12章动态内存个人觉得对于一个想要深入学习C++的人来说非常重要,对于内存的理解、动态数组、new和delete运算符,对于C++的理解更加”底层“一点,最后12.

Global site tag (gtag.js) - Google Analytics