何时使用“ - >” vs“。”处理结构时?

时间:2014-04-03 03:26:15

标签: c gcc struct

在我分配给指针的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?

4 个答案:

答案 0 :(得分:3)

在指针上使用.是不一致的GCC扩展。它应该警告你。

您需要freemalloc获得的所有内容。也就是说,将调用结果带到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一样,因为该变量是指针而且成员无法直接访问。

另请注意,该语法也适用于classunionbit 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() */