你可能不知道的编程小问题:预处理、sizeof

来源:互联网 发布:web服务器软件排名 编辑:程序博客网 时间:2024/05/23 02:11
面试题九、用一个定义宏FIND求一个结构体stuct里某个变量相对stuct的偏移量。
struct aa{int a;char b[20];};

答案--#define FIND(struct,e) (size_t)&(((struct*)0)->e)。FIND(aa,a);//等于0;FIND(aa,b);//等于4

解析--(struct *) 0表示把一段地址(以0开头的地址)看作struc(认为这里存储一个stuct变量);((struc *) 0)->e指向它的成员e;&(((struc*) 0)->e)取这个成员的地址,因为该结构体的首地址为0,所以就得到成员e距离结构体首地址的偏移量。(size_t) &(((struc*) 0)->e)把地址硬转为size_t类型(typedef unsigned int size_t)

注意:宏在C语言里及其重要,而在C++里的第一规则是:绝不应该去使用它,除非你不得不这样做!


面试题十、下面代码的输出结果是什么?

struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B;struct{double a1;float a2;int b;char c;}C;int main(){char s1[] = "0123456789";char* s2 = "0123456789";int s3[100];int* s4 = s3;cout<<sizeof(s1)<<endl;cout<<sizeof(s2)<<endl;cout<<sizeof(s3)<<endl;cout<<sizeof(s4)<<endl;cout<<sizeof(A)<<endl;cout<<sizeof(B)<<endl;cout<<sizeof(C)<<endl;}
答案--

11-----s1代表一个数组,使用sizeof会返回该数组分配到了字节(虽然数组名跟指针同是地址,但代表的意义不一样

4-------s2是一个指针,其长度是固定的,4字节

400---s3分配了400个字节

4-------同s2

6-------这里涉及到了结构体的对齐问题,结构体内的数据以最长的数据元素为对齐单位。a1、a2、a3都是2字节,所以sizeof(A)为6

8-------B中a1取4字节,a2去2字节,以4字节对齐,所以sizeof(B)为8

24-----C中a1去8字节,a2、a3共占8字节、a4取1字节,所以sizeof(C)为24


面试题十二、且看下列代码(sizeof和strlen的区别)

char s1[100] = "0123456789";int s2[100];cout<<sizeof(s1)<<" "<<strlen(s1);cout<<sizeof(s2)<<" "<<strlen(s2);//编译会出错
答案--100  10

解析--上题已经说到,sizeof返回该数组(类型)分配到的字节,sizeof(int)为4,它是一个运算符,返回类型是unsigned int <size_t>

strlen是一个函数,用来计算字符串的长度,只能用char* 做参数,且必须是以“\0”结尾的,如果你这样做:char* a; strlen(a);那么恭喜你,你的程序会马上死掉。


面试题十三、且看下面代码(空类占用的空间)

class A{};class A2{};class B : public A{};class C : public A,public A2{};class D : public virtual A{};class E{virtual void f(){};};int main(){cout<<sizeof(A)<<" ";cout<<sizeof(A2)<<" ";cout<<sizeof(B)<<" ";cout<<sizeof(C)<<" ";cout<<sizeof(D)<<" ";cout<<sizeof(E)<<" ";}
答案--1  1  1  1  4  4

解析--空类占1字节空间(规定),单一继承和多重继承还是占用1字节,但是涉及到虚函数、虚继承的有个虚表(虚指针),所以占用4字节。



0 0
原创粉丝点击