C中的结构内存分配

时间:2014-10-22 17:30:49

标签: c memory memory-management struct

使用struct分配malloc实例是否会影响其成员的分配?意思是,正在做这样的事情:

typedef struct { int *i; } test;
int main() {
     test *t = malloc(sizeof(test));
     t->i = malloc(sizeof(int));
}

...没有意义,因为i应该已经在堆上了,对吧?

或者,结构只是概念上的,以帮助程序员组两个完全独立的变量浮动在内存中?意思是:test *t = malloc(sizeof(test))只是分配内存来存储指向堆上成员的指针?

我对此感到非常困惑......

4 个答案:

答案 0 :(得分:4)

i的{​​{1}}字段是原始testint ing malloc会处理它所需的内存。将结果test分配给malloc会产生警告,因为您将指针隐式转换为i

编辑:
正如评论中指出的那样,自上述答案发布以来,该问题已被编辑。如果int包含指针,struct malloc将分配内存以保存指针,但将分配此指针指向的内存。为此,您需要第二次struct来电(例如malloc)。

答案 1 :(得分:1)

如果我是指向int的指针,你只会为i分配内存。见这个例子:

#include <stdlib.h>

typedef struct
{
        int i;
} test;

typedef struct
{
        int* i; 
} testp;

int main()
{
        test* foo = malloc(sizeof(*foo));
        foo->i = 3;

        testp* bar = malloc(sizeof(*bar));
        bar->i = malloc(sizeof(*bar->i));
        *bar->i = 3;
}

分配结构时,已经为int i分配了空间。

答案 2 :(得分:1)

当你调用第一个malloc时,有足够的内存来保存整个结构,包括&#39; * i&#39;,它有足够的位置来保存指向整数的指针。然而,领域*我仍然没有初始化!因此,在为第一个为整数保留内存的malloc分配它之前,不得使用* i。

答案 3 :(得分:1)

给定结构类型“test”,malloc(sizeof(test))为完整的结构分配空间,包括所有成员和之间的任何填充。您可能会对一个或多个成员是指针的情况感到困惑:

typedef struct {
    char *string;
    char array[8];
} test;

在这种情况下,指针本身是一个成员,并为其分配空间,但指向的是不是成员,并且没有分配空间为此。

与struct具有数组成员的情况进行对比:整个数组是结构的成员,并在结构中为其所有元素分配了足够的空间。