C/C++プログラミングにおけるいくつかの概念問題


1.次のコードに問題がありますか?
char* ptr = NULL;
printf("%s
", ptr); free(ptr);

資料を調べるとptr=NULLの場合free()関数はメモリ解放をしないので、上記のプログラムはエラーが発生しません.printf("%s",ptr);VS 2008を利用してコンパイラが出力しているのは(null)で、他のコンパイラが何を出力しているのか分かりません.
2.変数の前の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'」のメンバーではないと誤報されるので、感覚の2つのコロン::グローバル空間を表す.
3.Win 32プラットフォーム下のマイクロソフト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;4 byteを占める;虚関数の個数は、1つまたは複数にかかわらず4 byte(doubleタイプのデータが3で記述されている整列規則がある場合)のみを占め、虚関数は1つの虚関数テーブル(Virtual Table)によって実現されるため、ここでの4 byteは虚関数テーブルのポインタを格納する.
5.現在のソースファイルのファイル名とソースファイルの現在の行番号を印刷する
cout << __FILE__ ;
cout<<__LINE__ ;

__FILE__および_LINE__システム定義マクロです.このマクロはファイルで定義されているのではなく、コンパイラによって定義されています.
6.プログラムがc++コンパイラによってコンパイルされたかどうかを判断する
#ifdef __cplusplus
//doing something
#endif