malloc a "member" of struct v.s。结构非常简单时的整个结构
malloc a "member" of struct v.s. whole struct when struct is quite simple
我在该站点上搜索了有关 malloc
结构的主题。但是,我有一个小问题。结构元素上的 malloc
是否与整个结构上的 malloc
不同,尤其是当该结构非常简单时,也就是说,只有一个成员正是我们都想分配的?为了清楚起见,请参阅下面对应于 student
和 student2
结构的代码。
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。
我在该站点上搜索了有关 malloc
结构的主题。但是,我有一个小问题。结构元素上的 malloc
是否与整个结构上的 malloc
不同,尤其是当该结构非常简单时,也就是说,只有一个成员正是我们都想分配的?为了清楚起见,请参阅下面对应于 student
和 student2
结构的代码。
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。