📜  为什么空结构在 C++ 中的大小为 1 个字节,而在 C 中为 0 个字节

📅  最后修改于: 2022-05-13 01:55:48.212000             🧑  作者: Mango

为什么空结构在 C++ 中的大小为 1 个字节,而在 C 中为 0 个字节

结构体是 C/C++ 中用户定义的数据类型。结构创建了一种数据类型,可用于将可能不同类型的项目分组为单一类型。 'struct' 关键字用于创建结构。创建结构的一般语法如下所示:

句法-

struct structureName{
    member1;
    member2;
    member3;
    .
    .
    .
    memberN;
};

C++ 中的结构可以包含两种类型的成员:

  1. 数据成员——这些成员是普通的 C++ 变量。可以在 C++ 中使用不同数据类型的变量创建结构。
  2. 成员函数——这些成员是普通的 C++ 函数。与变量一起,函数也可以包含在结构声明中。

问题陈述:为什么空结构的大小在 C++ 中不为零,而在 C 中为零。

解决方案:
下面是一个空结构的 C 程序:



C
// C program with an empty
// structure
#include 
 
// Driver code
int main()
{
    // Empty Structure
    struct empty {
    };
 
    // Initializing the Variable
    // of Struct type
    struct empty empty_struct;
 
    // Printing the Size of Struct
    printf("Size of Empty Struct in C programming = %ld",
           sizeof(empty_struct));
}


C++
// C++ program to implement
// an empty structure
#include 
using namespace std;
 
// Driver code
int main()
{
    // Empty Struct
    struct empty {
    };
 
    // Initializing the Variable
    // of Struct type
    struct empty empty_struct;
 
    // Printing the Size of Struct
    cout << "Size of Empty Struct in C++ Programming = " << sizeof(empty_struct);
}


输出
Size of Empty Struct in C programming = 0

下面是一个空结构的 C++ 程序:

C++

// C++ program to implement
// an empty structure
#include 
using namespace std;
 
// Driver code
int main()
{
    // Empty Struct
    struct empty {
    };
 
    // Initializing the Variable
    // of Struct type
    struct empty empty_struct;
 
    // Printing the Size of Struct
    cout << "Size of Empty Struct in C++ Programming = " << sizeof(empty_struct);
}
输出
Size of Empty Struct in C++ Programming = 1

如果仔细观察,相同的代码在 C 和 C++ 中执行,但两种情况下的输出不同。让我们来讨论这背后的原因——

  1. C++ 标准不允许大小为 0 的对象(或类)。这是因为这将使两个不同的对象具有相同的内存位置成为可能。这就是为什么即使是空类和结构体的大小也必须至少为 1 的概念背后的原因。众所周知,空类的大小不为零。一般为1个字节。 C++ 结构也遵循与 C++ 类相同的原则,即 C++ 中的结构也不会是零字节。最小大小必须为 1 个字节。
  2. 在 C/C++ 中创建空结构是违反语法约束的。但是,GCC 允许 C 中的空结构作为扩展。此外,如果结构没有任何命名成员,则行为未定义,因为:

这意味着-

// Constraint Violation
struct EmptyGeeksforGeeks {};

// Behavior undefined, 
// since there is no named member
struct EmptyGeeksforGeeks {int :0 ;}; 

想要从精选的视频和练习题中学习,请查看C++ 基础课程,从基础到高级 C++ 和C++ STL 课程,了解基础加 STL。要完成从学习语言到 DS Algo 等的准备工作,请参阅完整的面试准备课程