你可能不知道的编程小问题:预处理、sizeof
2014-04-18 11:16
429 查看
面试题九、用一个定义宏FIND求一个结构体stuct里某个变量相对stuct的偏移量。
答案--#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++里的第一规则是:绝不应该去使用它,除非你不得不这样做!
面试题十、下面代码的输出结果是什么?
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的区别)
解析--上题已经说到,sizeof返回该数组(类型)分配到的字节,sizeof(int)为4,它是一个运算符,返回类型是unsigned int <size_t>
strlen是一个函数,用来计算字符串的长度,只能用char* 做参数,且必须是以“\0”结尾的,如果你这样做:char* a; strlen(a);那么恭喜你,你的程序会马上死掉。
面试题十三、且看下面代码(空类占用的空间)
解析--空类占1字节空间(规定),单一继承和多重继承还是占用1字节,但是涉及到虚函数、虚继承的有个虚表(虚指针),所以占用4字节。
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字节。
相关文章推荐
- 你可能不知道的编程小问题:程序基本概念
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
- 学习DX编程中的一个很丢脸,但是不知道是为什么的问题
- 翻译《有关编程、重构及其他的终极问题?》——20.光对文件做EOF检查可能还不够
- C/C++可能的面试问题(2)--再谈sizeof()
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
- 你可能不知道的SQL问题
- C# 使用线程你可能不知道的问题
- 关于图形化编程软件sikuli 初学者使用时可能容易出现的一些问题
- 做一个站长,如果以下50个问题,你不知道,你会很吃亏的,也有可能你是一个倒霉的站长。
- GTK+3.0加Glade3 编程时可能遇到的问题详解
- 黄聪:C# 使用线程你可能不知道的问题
- 第一次联想到了编程思想(看书始终是会起有用的,虽然你可能不知道什么时候会起作用)
- 取样问题 总数n事先不知道,等概率取样 (编程珠玑chapter12 课后题10)
- 本来刚学j2me手机编程,遇到一个问题,可能比较浅,请不吝赐教!
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解) .
- 本来刚学j2me手机编程,遇到一个问题,可能比较浅,请不吝赐教!
- DevC++ Socket编程时可能遇到的问题
- 取样问题 总数n事先不知道,等概率取样 (编程珠玑chapter12 课后题10)