是什么导致c代码中的分段错误,跨函数的动态分配
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是什么导致c代码中的分段错误,跨函数的动态分配相关的知识,希望对你有一定的参考价值。
我试图动态分配结构数组并对它们执行操作但我仍然遇到分段错误。有人可以帮帮我吗?
#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
", 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;
}
我标记了第一个seg故障发生的位置(使用ddd)。我没有得到的是我可以在main中操纵point [1]但在任何其他函数中都没有。
我同意@Maxim Skurydin。不过,我想在更多细节中解释你的错误。
阅读你的init_fig
假设您传递struct figure **point
的参数 - 实际上是指向struct figure
的指针数组。并且此函数访问其n
'th元素。
但是在你的main
你做了别的事情。你分配了一个struct figure
数组,你的point
变量指向它的头部。然后你取这个局部变量的地址并调用你的init_fig
。
这是问题所在。 init_fig
假设你传递了一个指针数组,而实际上这个“数组”只包含一个元素:在point
中声明的本地main
变量。
编辑:
如何正确地做到这一点。
- 保持
main
完整,修复init_fig
。
这意味着实际上有一系列figure
结构。均值 - 单个内存块,解释为后续结构数组。
void init_fig(int n, struct figure *point)
{
printf("%u
", 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;
}
- 让
init_fig
完好无损。修复main
。
这意味着我们实际上应该分配一个指针数组,每个指针应该指向一个分配的point
结构。
int main()
{
int numfigs = 1;
struct figure ** point;
point = malloc(sizeof(struct figure*) * 16);
for (i = 0; i < 16; i++)
point[i] = malloc(sizeof(struct figure));
point[1].coordcount = 1;
init_fig(numfigs, &point);
return 0;
}
您分配内存并将指针存储在point
中,但是当您为其分配&fig
时,您会忘记该指针。
point = malloc(sizeof(struct figure) * 16);
point = &fig;
所以,你基本上是在尝试写fig[1]
,这没有意义。
struct figure * point;
point = malloc(sizeof(struct figure) * 16);
这里指向指向堆中16个结构的内存的指针,但是在下一行中你完成了这个
point = &fig;
所以它的内存泄漏和点也不再指向分配的区域了
而且init_fig
应该是这样的
void init_fig(int n, struct figure **point)
这是段错误的问题
消除这条线point = &fig;
并修改功能:
void init_fig(int n, struct figure *point)
{
...
point[n].pointer = (coords*) malloc(sizeof(coords) * 20);
...
}
因为你应该传递一个结构数组而不是一个指针数组。
另外,在init_fig函数中添加第三个参数,以便传递要创建的点数组的大小。喜欢 :
void init_fig(int n, struct figure *point, int size)
{
...
point[n].pointer = (coords*) malloc(sizeof(coords) * size);
...
}
因此,使功能更可重用。
修改对该函数的调用:
init_fig(numfigs, &point); to init_fig(numfigs, point);
以上是关于是什么导致c代码中的分段错误,跨函数的动态分配的主要内容,如果未能解决你的问题,请参考以下文章