我创建了一个struct
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));
我尝试通过
索引结构化块p1->p[4]->top;
但我收到了错误。有没有办法在C
中索引指向指针类型的指针答案 0 :(得分: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.
第二个选项不太可取,但取决于你,因为对一行中的10个对象执行单个malloc
比执行单个对象的10倍和第11次初始化基指数组更有效。
答案 1 :(得分:0)
在struct y{ ...; s **p }
中,成员p
表示指向结构s
的指针,而不是指向结构s
的指针。
因此,p1->p[4]
是指向s
的指针,而不是s
本身,因此您无法访问具有访问者top
的成员.
。为了解决编译器错误,您必须使用访问器->
,它取消引用指针值,但随后在运行时产生未定义的行为,因为指针值未初始化。
要解决此问题,您可以将p
的数据类型更改为s *p
(由@ tilz0R建议),或者您可以调整代码以实际处理指针指针:< / p>
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
,这在结构对象数组中是不可能的。