malloc a "member" of struct v.s。结构非常简单时的整个结构

malloc a "member" of struct v.s. whole struct when struct is quite simple

我在该站点上搜索了有关 malloc 结构的主题。但是,我有一个小问题。结构元素上的 malloc 是否与整个结构上的 malloc 不同,尤其是当该结构非常简单时,也就是说,只有一个成员正是我们都想分配的?为了清楚起见,请参阅下面对应于 studentstudent2 结构的代码。

struct student {
    int* majorScore;
};

struct student2 {
    int majorScore[3];
};


int main()
{
    struct student john;
    john.majorScore = (int*) malloc(sizeof(int) * 3);
    john.majorScore[0] = 50;
    john.majorScore[1] = 27;
    john.majorScore[2] = 56;
 
    struct student2* amy= (struct student2*)malloc(sizeof(struct student2));
    amy->majorScore[0] = 50;
    amy->majorScore[1] = 27;
    amy->majorScore[2] = 56;


    return 0;
}

他们的记忆力有区别吗?如果是,有什么区别?如果不是,就良好的编程风格而言,哪个可能更好?

首先,您动态分配一个结构,而不是另一个。所以你是在拿苹果和橙子做比较。


静态分配的结构:

struct student john;
john.majorScore = malloc(sizeof(int) * 3);
john.majorScore[0] = 50;
john.majorScore[1] = 27;
john.majorScore[2] = 56;

struct student2 amy;
amy.majorScore[0] = 50;
amy.majorScore[1] = 27;
amy.majorScore[2] = 56;
struct student john
+------------+----------+      +----------+
| majorScore |         ------->|       50 |
+------------+----------+      +----------+
| [padding]  |          |      |       27 |
+------------+----------+      +----------+
                               |       56 |
                               +----------+

struct student2 amy
+------------+----------+
| majorScore |       50 |
|            +----------+
|            |       27 |
|            +----------+
|            |       56 |
+------------+----------+
| [padding]  |          |
+------------+----------+

struct student 使用更多的内存,因为它有一个额外的值(指针),并且它有两个内存块的开销而不是一个。

struct student2 总是有恰好三个乐谱的内存,即使您需要更少的乐谱。而且它不可能容纳超过 3 个。


动态分配的结构:

struct student *john = malloc(sizeof(struct student));
john->majorScore = malloc(sizeof(int) * 3);
john->majorScore[0] = 50;
john->majorScore[1] = 27;
john->majorScore[2] = 56;

struct student2 *amy = malloc(sizeof(struct student2));
amy->majorScore[0] = 50;
amy->majorScore[1] = 27;
amy->majorScore[2] = 56;
struct student *john
+----------+      +------------+----------+      +----------+
|         ------->| majorScore |         ------->|       50 |
+----------+      +------------+----------+      +----------+
                  | [padding]  |          |      |       27 |
                  +------------+----------+      +----------+
                                                 |       56 |
                                                 +----------+

struct student2 *amy
+----------+      +------------+----------+
|         ------->| majorScore |       50 |
+----------+      |            +----------+
                  |            |       27 |
                  |            +----------+
                  |            |       56 |
                  +------------+----------+
                  | [padding]  |          |
                  +------------+----------+

同上分析。

结构上的 malloc 简单吗?当然,确实如此。尽管您的 struct student2 定义不需要任何 malloc,但我认为直接使用结构并避免使用 malloc 会简单得多。重要的是要注意结构上的 malloc 只会分配结构本身的大小,而不是结构内指针指向的动态数据的大小。您正在比较的是两个具有非常不同实现的不同结构,因此说“哪个更好”是不公平的,因为它在很大程度上取决于您的实际用例。

为清楚起见,假设您做到了 struct student* john = malloc(sizeof(struct student))。如果你为这样的结构分配存储空间,你仍然需要为 majorScore 分配内存,因为它最初的 malloc 只为 int * 分配空间,而没有分配空间。如您所见,这使事情变得更加复杂。

所以结论是,一般情况下你只希望在编译时不知道数据大小的情况下使用malloc进行动态内存分配。在您提供的示例中,没有理由通过 malloc 引入复杂性(并且可能 bugs/leaks)。在 struct student 的示例中使用 malloc 的效用是 majorScore 可以是任何大小的数组,而不仅仅是 struct student2 定义中的 3。