在我分配给指针的c结构中,我必须使用 - >但我必须使用 - >对于类型如int。
例如
struct foo{
struct foo* a;
int b;
}
struct foo* ptr = (struct foo*) malloc(sizeof( struct foo ));
什么是正确的
ptr->a = something;
ptr->b = 44;
或
ptr->a = something;
ptr.b = 44;
为了解放我是否必须释放b,因为我必须释放?
free(ptr->a);
free(ptr.b); // do i have to do this?
答案 0 :(得分:3)
在指针上使用.
是不一致的GCC扩展。它应该警告你。
您需要free
从malloc
获得的所有内容。也就是说,将调用结果带到malloc
并将其传递给free
。就这么简单。不要free
其他任何内容。
答案 1 :(得分:2)
当变量是指向数据类型(用户定义)的指针时,请使用“->
”
假设访问结构中成员的DEFAULT方式是使用“.
”
typedef struct {
int a;
int b*;
float f;
float pf;
myStruct next*;
char* c;
}myStruct;
//accessing all its members by DEFAULT:
myStruct dataA;
int valA = dataA.a;
int* pvalB = dataA.b;
float valF = dataA.f;
float* pf = dataA.pf;
myStruct next* = dataA.c;
注意:使用“.
”访问所有成员,无论它们是否为指针
现在,如果您将一个POINTER定义为myStruct
对象:
myStruct *pdataA = &dataA;
int valA2 = pdataA->a;
int* pvalB2 = pdataA->b;
float valF2 = pdataA->f;
float* pf2 = pdataA->pf;
myStruct next2* = pdataA->c;
就像“->
”首先解除pdataA
一样,因为该变量是指针而且成员无法直接访问。
另请注意,该语法也适用于class
,union
和bit fields
。只要它们是具有成员的数据类型。
要释放已分配的struct对象,只需传递指针变量。
myStruct* pdataB = (myStruct*)malloc(sizeof(myStruct));
// some code here...
free(pdataB);
请确保释放从堆分配的myStruct
对象。(即使用malloc()
)。
myStruct dataC;
myStruct pdataD* = dataC;
//free(dataC); //invalid
//free(&dataC); //invalid
//free(pdataD); //invalid
如果单独分配成员变量,也可以单独释放它:
myStruct* pdataF = (myStruct*)malloc(sizeof(myStruct));
pdataF->b = (int*)malloc(sizeof(int) * 500);
pdataF->pf = (float*)malloc(sizeof(float) * 700);
// some code here...
free(pdataF->b);
free(pdataF->pf);
free(pdataF); //free the main object last.
myStruct dataG;
dataG.b = (int*)malloc(sizeof(int) * 500);
dataG.pf = (float*)malloc(sizeof(float) * 700);
// some code here...
free(dataG.b);
free(dataG.pf);
//free(&dataG); //invalid because it's not allocated.
答案 2 :(得分:1)
.
使用指针访问结构的成员时使用->
。
所以,ptr->a = something;
是正确的。
此外,您free
分配了一些东西。是,而不是free(ptr->a);
使用free(pt);
,因为您已分配ptr
而非ptr->a
答案 3 :(得分:0)
你必须使用 - >对于a和b
ptr->a = something;
ptr->b = 44;
要免费,您可以使用
free (ptr); /* since ptr is what we got from malloc() */