C语言中的动态数组

C语言中的动态数组,c,segmentation-fault,malloc,C,Segmentation Fault,Malloc,我试图动态创建一个包含随机值的矩形数组。但是,当尝试访问空间Imalloc时,我遇到seg故障 我的代码: typedef struct Point { double x; double y; } PointT; typedef struct Rect { PointT location; char color; double w; //width double h; //height } RectT; main() { RectT *r

我试图动态创建一个包含随机值的矩形数组。但是,当尝试访问空间I
malloc
时,我遇到seg故障

我的代码:

typedef struct Point
{
    double x;
    double y;
} PointT;

typedef struct Rect
{
    PointT location;
    char color;
    double w; //width
    double h; //height
} RectT;
main()
{
    RectT *recs;
    randRect(&recs);
}
void randRect(RectT **rects)
{
    int i;
    rects =malloc(numRec*sizeof(RectT*));
    for(i = 0; i < numRec-1; i++)
    {
          rects[i]->w=rand()%20;
          rects[i]->h=rand()%20;
          rects[i]->location.x=rand()%20;
          rects[i]->location.y=rand()%20;
    }
}
typedef结构点
{
双x;
双y;
}尖端;
typedef struct Rect
{
点定位;
炭色;
双w;//宽度
双h;//高度
}RectT;
main()
{
RectT*recs;
randRect(和recs);
}
void randRect(RectT**rects)
{
int i;
rects=malloc(numRec*sizeof(RectT*);
对于(i=0;iw=rand()%20;
rects[i]>h=rand()%20;
rects[i]->location.x=rand()%20;
rects[i]->location.y=rand()%20;
}
}

numRec
定义为
50

RectT
指针数组分配空间,但从不为它们指向的
RectT
指针数组分配空间。

RectT
指针数组分配空间,但是您从不为它们指向的
rect
s分配空间。

函数中的rect是指向指针的指针。所以,在使用RectT项数组之前,需要分配它。应该是这样的:

void randRect(RectT **rects)
{
    int i;
    *rects =malloc(numRec*sizeof(RectT));
    for(i = 0; i < numRec; i++)
    {
      (*rects)[i].w=rand()%20;
      (*rects)[i].h=rand()%20;
      (*rects)[i].location.x=rand()%20;
      (*rects)[i].location.y=rand()%20;
    }
}
void randRect(RectT**rects)
{
int i;
*rects=malloc(numRec*sizeof(RectT));
对于(i=0;i
或者更好的方式:

Rect* randRect()
{
    int i;
    Rect* rects =malloc(numRec*sizeof(RectT));
    for(i = 0; i < numRec; i++)
    {
      rects[i].w=rand()%20;
      rects[i].h=rand()%20;
      rects[i].location.x=rand()%20;
      rects[i].location.y=rand()%20;
    }
    return rects;
}
Rect*randRect()
{
int i;
Rect*rects=malloc(numRec*sizeof(RectT));
对于(i=0;i
函数中的矩形是指向指针的指针。所以,在使用RectT项数组之前,需要分配它。应该是这样的:

void randRect(RectT **rects)
{
    int i;
    *rects =malloc(numRec*sizeof(RectT));
    for(i = 0; i < numRec; i++)
    {
      (*rects)[i].w=rand()%20;
      (*rects)[i].h=rand()%20;
      (*rects)[i].location.x=rand()%20;
      (*rects)[i].location.y=rand()%20;
    }
}
void randRect(RectT**rects)
{
int i;
*rects=malloc(numRec*sizeof(RectT));
对于(i=0;i
或者更好的方式:

Rect* randRect()
{
    int i;
    Rect* rects =malloc(numRec*sizeof(RectT));
    for(i = 0; i < numRec; i++)
    {
      rects[i].w=rand()%20;
      rects[i].h=rand()%20;
      rects[i].location.x=rand()%20;
      rects[i].location.y=rand()%20;
    }
    return rects;
}
Rect*randRect()
{
int i;
Rect*rects=malloc(numRec*sizeof(RectT));
对于(i=0;i
您需要为矩形分配空间,而不是为指向矩形的指针分配空间:

void randRect(RectT **rects) }
  *rects = malloc(numRec * sizeof(RectT));

  for (size_t i = 0; i != numRec; ++i) {
    (*rects)[i]->w = 0; // etc
  }
}

您需要为矩形分配空间,而不是为指向矩形的指针分配空间:

void randRect(RectT **rects) }
  *rects = malloc(numRec * sizeof(RectT));

  for (size_t i = 0; i != numRec; ++i) {
    (*rects)[i]->w = 0; // etc
  }
}

更改
rects=malloc(numRec*sizeof(RectT*)
*rects=malloc(numRec*sizeof(RectT))
。似乎您需要决定是否需要指向
RectT
RectT
的指针数组,因为
sizeof(RectT*)
sizeof(RectT)
Change
rects=malloc(numRec*sizeof(RectT*)不同
*rects=malloc(numRec*sizeof(RectT))
。似乎您需要决定是否需要指向
RectT
RectT
的指针数组,因为
sizeof(RectT*)
不同于
sizeof(RectT)
是的,它是“指向指针的指针”。但在C语言中,访问rect[]和rect*项的语法是不变的。这在本示例中实际使用。这就是我写“指向数组的指针”的原因。是的,这是一个“指向指针的指针”。但在C语言中,访问rect[]和rect*项的语法是不变的。这在本示例中实际使用。这就是我写“指向数组的指针”的原因。