如何索引包含指向struct的指针的struct,该指针是malloc块

时间:2017-06-13 21:28:52

标签: c pointers struct

我创建了一个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

中索引指向指针类型的指针

2 个答案:

答案 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,这在结构对象数组中是不可能的。