C/C++编程中的一些概念问题

18 篇文章 0 订阅

1.下面的代码会有问题吗?

char* ptr = NULL;
printf("%s\n", ptr);
free(ptr);

查资料发现当ptr=NULL时free()函数是不做内存释放的,所以上面的程序不会出错。至于printf("%s\n", ptr);利用VS2008编译器输出的是(null),不知道其它编译器输出什么。

2.变量前的两个冒号(::)

int x = 5;
int  main(int argc, char* argv[]){ 
	int x = 3;
	std::cout<<x<<' '<<::x<<std::endl;
} 
输出的结果是“3 5”,如果去掉全局的定义"int x = 5;"它会报错说“x”: 不是“`global namespace'”的成员,所以觉的两个冒号::表示全局空间。

3. Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略:
 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
 3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。

出处:http://blog.csdn.net/hilyoo/article/details/4464448

4. sizeof(TestClassSize)的输出结果?

class TestClassSize{
public:
	virtual void fun(void){cout<<"fun"<<endl;}
	virtual void fun2(void){};
private:
	int t;
};

sizeof(TestClassSize)的输出结果为8,其中int t;占4byte;虚函数的个数无论一个或多个都只占4byte(如果有double类型的数据按3所述的对齐规则),因为虚函数是通过一张虚函数表(Virtual Table)来实现的,所以这里的4byte存放虚函数表的指针。

5.打印出当前源文件的文件名以及源文件的当前行号

cout << __FILE__ ;
cout<<__LINE__ ;

__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。

6.判断程序是否由c++编译程序编译的

#ifdef __cplusplus
//doing something
#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值