web-dev-qa-db-ja.com

sizeofの空の構造はCでは0、C ++では1なのはなぜですか?

可能性のある重複:
C++の空のクラス
Cの空の構造体のサイズは?

C++で空の構造体のサイズが1であるとどこかで読んだので、それを確認することを考えました。残念ながら、私はそれをCファイルとして保存し、<stdio.h>ヘッダーと出力を見て驚いた。 0でした。

つまり

struct Empty {

};

int main(void)
{
  printf("%d",(int)sizeof(Empty));
}

cファイルとしてコンパイルした場合は0、C++ファイルとしてコンパイルした場合は1を出力していました。その理由を知りたい。サイズが0の場合、クラスの2つのオブジェクトが同じアドレスを持っているため、c ++のsizeof空の構造体はゼロではないことを読みました。これは不可能です。どこが間違っているのですか?

34
Ninad Page

Cで空の構造を持つことはできません。これは構文制約違反です。ただし、gccはCで空の構造を許可します 拡張として 。さらに、構造に名前付きメンバーがない場合の動作はundefinedです。

C99さんのコメント:

Struct-declaration-listに名前付きメンバーが含まれていない場合、動作は未定義です。

そう

struct Empty {}; //constraint violation

struct Empty {int :0 ;}; //no named member, the behaviour is undefined.

そして、はい、空の構造体のサイズはC++です ゼロにはできません :)

16
Prasoon Saurav

いくつかの理由があります。特に、これは、その構造体へのポインターに対するポインター演算が無限ループにつながることがないようにするためです。詳しくは:

http://bytes.com/topic/c/insights/660463-sizeof-empty-class-structure-1-a

9
vog

これがなぜ起こるのか、そしてより適切にはそれを回避する(安全な)方法を説明する素晴らしい記事があります:)

http://www.cantrip.org/emptyopt.html

6
Necrolis