是什么导致了c代码中的分段错误,动态分配accross函数

是什么导致了c代码中的分段错误,动态分配accross函数,c,dynamic,segmentation-fault,C,Dynamic,Segmentation Fault,我试图动态分配结构数组并对其执行操作,但我一直遇到分段错误。有人能帮我吗 #include <stdio.h> #include <stdlib.h> #include <string.h> void *malloc(size_t size); typedef struct { double x; double y; } coords; struct figure { char fig_name[128]; int coordcount,

我试图动态分配结构数组并对其执行操作,但我一直遇到分段错误。有人能帮我吗

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void *malloc(size_t size);

typedef struct {
  double x;
  double y;
} coords;

struct figure {
  char fig_name[128];
  int coordcount, size_tracker;
  coords *pointer;
} fig;

void init_fig(int n, struct figure **point)
{
  printf("%u\n", sizeof(coords));
  point[n]->pointer = malloc(sizeof(coords) * 20);  <-------SEGFAULT
  if (point[n]->pointer == NULL){
    exit(-1);
  }
  point[n]->pointer[19].x = 2;
  point[n]->pointer[0].x = 1;
  point[n]->pointer[0].y = 2;
  point[n]->pointer[7].x = 100;
}

int main()
{
  int numfigs = 1;
  struct figure * point;
  point = malloc(sizeof(struct figure) * 16);
  point = &fig;
  point[1].coordcount = 1;
  init_fig(numfigs, &point);
  return 0;
}
#包括
#包括
#包括
void*malloc(大小);
类型定义结构{
双x;
双y;
}协调;
结构图形{
char fig_名称[128];
int coordcount,尺寸跟踪;
坐标*指针;
}无花果;
无效初始图(整数n,结构图**点)
{
printf(“%u\n”,sizeof(coords));
点[n]->指针=malloc(sizeof(coords)*20);指针==NULL){
出口(-1);
}
点[n]->指针[19].x=2;
点[n]->指针[0].x=1;
点[n]->指针[0],y=2;
点[n]->指针[7],x=100;
}
int main()
{
int numfigs=1;
结构图*点;
点=malloc(sizeof(结构图)*16);
点=&图;
点[1]。coordcount=1;
初始图(numfigs和point);
返回0;
}

我标记了第一个seg故障发生的位置(使用ddd)。我没有得到的是,我可以在main中操作点[1],但不能在任何其他函数中操作点。

您分配内存并将指针存储在
点中,但当您将
&fig
分配给它时,您忘记了该指针

point = malloc(sizeof(struct figure) * 16);
point = &fig;
因此,您实际上是在试图编写图[1]
,这毫无意义

  struct figure * point;
  point = malloc(sizeof(struct figure) * 16);
这里的指针指向堆中16个结构的内存 但在下一行中,您已经做到了这一点

  point = &fig;
所以它的内存泄漏点也不再指向分配的区域

而且
init_fig
应该是这样的

void init_fig(int n, struct figure **point)

这是SEGFULT的问题

我同意@Maxim Skurydin的观点。 不过,我想更详细地解释一下你的错误

读取
init_fig
时,假设传递的参数
struct figure**point
-实际上是指向
struct figure
的指针数组。这个函数访问它的
n
第n个元素

但是,在
main
中,您可以执行其他操作。将一个
结构图
数组和
变量点分配给它的头部。然后取这个局部变量的地址并调用
init\u fig

问题出在这里
init\u fig
假设您向它传递一个指针数组,而实际上这个“数组”只包含一个元素:在
main
中声明的局部
变量

编辑:

如何正确地做到这一点

  • 保持
    main
    不变,修复
    init\u fig
  • 这意味着实际上有一个
    结构的数组。平均值-单个内存块,被解释为后续结构的数组

    void init_fig(int n, struct figure *point)
    {
      printf("%u\n", sizeof(coords));
      point[n].pointer = malloc(sizeof(coords) * 20);  <-------SEGFAULT
      if (point[n].pointer == NULL){
        exit(-1);
      }
      point[n].pointer[19].x = 2;
      point[n].pointer[0].x = 1;
      point[n].pointer[0].y = 2;
      point[n].pointer[7].x = 100;
    }
    

    消除这一行
    点=&fig

    并修改功能:

    void init_fig(int n, struct figure *point)
    {
      ...
      point[n].pointer = (coords*) malloc(sizeof(coords) * 20);
      ...
    }
    
    init_fig(numfigs, &point); to init_fig(numfigs, point);
    
    因为您应该传递一个结构数组,而不是指针数组

    另外,向init_fig函数添加第三个参数,以便可以传递要创建的点数组的大小。比如:

    void init_fig(int n, struct figure *point, int size)
        {
          ...
          point[n].pointer = (coords*) malloc(sizeof(coords) * size);
          ...
        }
    
    因此,使函数更易于重用

    还要修改对该函数的调用:

    void init_fig(int n, struct figure *point)
    {
      ...
      point[n].pointer = (coords*) malloc(sizeof(coords) * 20);
      ...
    }
    
    init_fig(numfigs, &point); to init_fig(numfigs, point);
    

    这不是我的项目,它只是一个简短的测试文件,我一直在用它来尝试找出为什么我会遇到seg故障。。你介意我问一下我是怎么做的吗?我的函数应该采用结构图*点吗?或者我应该在main中初始化一个结构图**点。抱歉,我对此有点陌生。好的,我做了选项1,但现在我可以将内容分配给点[n]。指针[233],它远远超出分配的20。为什么这样做有效?我应该有seg故障吗?点[n]。指针[233]。x=2;printf(“%lf\n”,点[n]。指针[233].x)@user1787262在分配的内存之外写入或读取是未定义的行为。如果你非常幸运,它会立即崩溃;如果你运气不好,它会破坏重要数据,然后崩溃。别这么做,谢天谢地你解释了。我最初是按照您上面描述的方式编写程序的,但当我可以在分配的范围之外编写时,我感到困惑。但现在你解释了,我明白了,谢谢@丹尼尔菲舍尔