C语言中的结构内存分配

C语言中的结构内存分配,c,memory,memory-management,struct,C,Memory,Memory Management,Struct,使用malloc分配struct实例是否会对其成员的分配产生任何影响?也就是说,正在做这样的事情: typedef struct { int *i; } test; int main() { test *t = malloc(sizeof(test)); t->i = malloc(sizeof(int)); } 。。。没有意义,因为i应该已经在堆上了,对吗 或者,结构只是概念性的,以帮助程序员将内存中浮动的两个完全独立的变量分组?这意味着:test*t=malloc

使用
malloc
分配
struct
实例是否会对其成员的分配产生任何影响?也就是说,正在做这样的事情:

typedef struct { int *i; } test;
int main() {
     test *t = malloc(sizeof(test));
     t->i = malloc(sizeof(int));
}
。。。没有意义,因为
i
应该已经在堆上了,对吗

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


我对此感到非常困惑。

测试的
I
字段是一个原始
int
,而
malloc
ing
test
将处理它所需的内存。将
malloc
的结果指定给
i
应该会产生警告,因为您正在隐式地将指针转换为
int

编辑:

正如评论中指出的那样,自上述答案发布以来,该问题已被编辑。如果
struct
包含指针,则
malloc
调用
struct
将分配内存以容纳指针,但不会分配该指针指向的内存。为此,您需要第二个
malloc
调用(例如,
test->i=malloc(sizeof(int))

如果i是指向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;
}试验;
类型定义结构
{
int*i;
}testp;
int main()
{
测试*foo=malloc(sizeof(*foo));
foo->i=3;
testp*bar=malloc(sizeof(*bar));
条->i=malloc(sizeof(*条->i));
*棒->i=3;
}

当您分配结构时,已经为
inti

分配了空间。当您调用第一个malloc时,有足够的内存容纳整个结构,包括'*i',它有足够的位置容纳指向整数的指针。但是,字段*i仍然未初始化!因此,在将*i分配给为整数保留内存的第二个malloc之前,不能使用它。

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

typedef struct {
    char *string;
    char array[8];
} test;
在这种情况下,指针本身是一个成员,并为其分配了空间,但指向的对象不是成员,也没有为其分配空间


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

t->i=malloc(sizeof(int))
应该给你一个编译器警告,你正在向int抛出指针。你不需要为堆上的
int
分配内存,除非该结构被定义为
struct{int*i;}
@Klapsa2503:哦,是的,我将编辑它。仅供参考,由于对问题进行了编辑,这个答案似乎是错误的。因此,如果我有一个包含指向其他类型结构的指针的结构,并且我使用
malloc
分配它,那么我必须在成员结构上再次使用
malloc
,这样它也可以动态分配,对吗?是的,容器结构(确定要分配的内存量)的
sizeof
包含内部指针的空间,但不包含可指向的单独“内部”结构的空间。如果您不想指向一个独立的、预先存在的内部结构(例如,您可能希望在链表中这样做),那么您需要为这样的内部结构单独分配内存。