是什么导致了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在分配的内存之外写入或读取是未定义的行为。如果你非常幸运,它会立即崩溃;如果你运气不好,它会破坏重要数据,然后崩溃。别这么做,谢天谢地你解释了。我最初是按照您上面描述的方式编写程序的,但当我可以在分配的范围之外编写时,我感到困惑。但现在你解释了,我明白了,谢谢@丹尼尔菲舍尔