首页 > 解决方案 > 访问结构中的结构指针时出现分段错误

问题描述

我有一个指向 struct 的指针的问题,它的成员也是指向 struct 的指针。

浏览建议的类似问题,我发现了这一点:

在另一个指向结构的指针内访问结构指针内的元素

人们建议注意结构的分配内存。

我认为这在我的代码中是正确的。

typedef struct {
  int id_vec;
  float *vec_value;
} Vector;

typedef struct cluster{
  int id_cluster;
  float *centroid;
  Vector *patternInCluster; 
} Cluster;

int main(void){
  Cluster *cluster_ptr= malloc(3 * sizeof(Cluster));
  if (cluster_ptr==NULL){
    printf("NULL");
  }
  cluster_ptr->patternInCluster=malloc(2 * sizeof(Vector *));
  if (cluster_ptr->patternInCluster==NULL){
    printf("NULL");
    cluster_ptr->patternInCluster=NULL;
  }

  float p1[3]={0.0f,1.0f,2.0f};
  Vector *somePattern=malloc(2 * sizeof(Vector));
  somePattern[0].id_vec=1;
  somePattern[0].vec_value=p1;
  somePattern[1].id_vec=2;
  somePattern[1].vec_value=p1;
}

然后我希望这个声明有效:

cluster_ptr[1].patternInCluster[1]=somePattern[1];

但它编译并产生分段错误。

出乎意料的是,以下语句没有出错:

cluster_ptr[0].patternInCluster[1]=somePattern[1];

和一个测试告诉我正确的结果(somePattern[1] id and value)

我尝试使用 gdb 进行调试,但我只能看到:

Program received signal SIGSEGV, Segmentation fault. 0x00005555555547fe in main () at test_struct.c:36 36 cluster_ptr[1].patternInCluster[1]=somePattern[1];

我错过了一些分配错误吗?

标签: cpointersstructsegmentation-fault

解决方案


这是因为你没有完全填充东西。

这条线

cluster_ptr->patternInCluster=malloc(2 * sizeof(Vector *));

和说的一样

cluster_ptr[0].patternInCluster=malloc(2 * sizeof(Vector *));

并且确实考虑到cluster_ptr已分配为 3 Cluster,在您的代码中执行后者会更清晰。

由于cluster_ptr[1].patternInCluster没有被赋予一个值,试图取消引用它会导致未定义的行为,但更有可能导致分段错误。


推荐阅读