2017-06-13 232 views
1

我正在创建一个结构如何包含一个指针,指向指针结构,其是malloc的块

typedef struct t{ 
    int top; 
    int value; 
    }s; 

和另一结构

typedef struct y{ 
     int top1; 
     s **p 
}z; 
    z *p1; 

由malloc的创建的块索引结构

p1 = (z*) malloc(sizeof(z)); 
p1->p = (s**) malloc(10 * sizeof(s)); 

我尝试索引s的结构块由

p1->p[4]->top; 

但我得到错误。有没有办法将索引指针指向指针类型C

+1

不要施放'malloc'和朋友的结果! – Olaf

+0

@ tilz0R这很有趣。 – Stargateur

+0

重新“*但我得到错误*”,请提供错误信息! – ikegami

回答

3

用单个指针对它们进行寻址。

typedef struct y{ 
    int top1; 
    s *p; //Single pointer only 
}z; 

z *p1; 
p1 = malloc(sizeof(z)); //Don't cast... 
p1->p = malloc(10 * sizeof(s)); 

//And then: 
p1->p[4].top; 

如果你仍然想双指针,则:

typedef struct y{ 
    int top1; 
    s **p; 
} z; 

z *p1; 
size_t i; 

p1 = malloc(sizeof(z)); //Create z structure object 
p1->p = malloc(10 * sizeof(*p1->p)); //Create array of pointers to objects 

//Now fill that array with your objects 
for (i = 0; i < 10; i++) { 
    p1->p[i] = malloc(sizeof(*p1->p[i])); 
} 

//Now access to property as: 
p1->p[4]->top; //Do something. 

第二个选项是不太可取,但取决于你自己,因为连续做单一malloc为10个对象是更有效比做单个对象的10倍和第11次初始化基本指针数组要多。

0

struct y{ ...; s **p }中,成员p表示指向结构s的指针,而不是指向结构s的指针。 因此p1->p[4]是指向s的指针,而不是s本身,因此您不能使用访问者.访问成员top。为了解决编译器错误,你必须使用访问器->,它取消引用指针值,但是在运行时会产生未定义的行为,因为指针值没有初始化。

为了解决这个问题,你可以任意的p的数据类型更改为s *p(由@ tilz0R的建议),或者你可以调整你的代码实际上指针处理的指针:

typedef struct t{ 
    int top; 
    int value; 
}s; 

typedef struct y{ 
    int top1; 
    s **p; 
}z; 
z *p1; 

int main() { 
    p1 = malloc(sizeof(z)); 
    p1->p = malloc(10 * sizeof(s*)); 
    for (int i=0; i<10; i++) { 
     p1->p[i] = malloc(sizeof(s)); 
    } 

    p1->p[4]->top = 5; 

} 

注指向指针的指针的处理更复杂,因为您需要一个额外的步骤/循环来初始化指针并在稍后释放它们。所以实际上我更喜欢s *p -way;但有时指针的指针更合适,例如如果阵列的特定插槽应保持“空”;那么你可以将相应的指针设置为NULL,这在一个结构对象数组中是不可能的。