C - 通过指针从函数中获取结构 - 分段错误

时间:2013-05-02 16:53:42

标签: c pointers struct segmentation-fault

我对C很新,我在使用这个功能时遇到了很多麻烦。我有一个声明为:

的结构
struct nivel {
    size_t filas;
    size_t columnas;
    int **mapa;
};

它只是一个2d数组,有它的大小信息。现在,我有一个读取文本文件并生成“nivel”的函数,它被定义为:

void nuevo_nivel_desde_archivo(struct nivel * nuevo_nivel, char *nombre_archivo ){
 nuevo_nivel->filas = 0;
 nuevo_nivel->columnas = 0;
 ...

我将发布这一部分,因为它是问题所在的地方。我一直认为我可以创建一个接收指向结构的指针并“填充”的函数,所以我调用了函数:

struct nivel *nuevo_nivel;
nuevo_nivel_desde_archivo(nuevo_nivel,nombre_archivo);

Nombre_archivo只保存文本文件的名称。当我尝试将cero分配给结构的任何字段时,出现分段错误错误。从我现在的指针,它应该工作,但我担心我在这里遗漏了一些东西并犯了一个大错。任何帮助将不胜感激。

编辑:谢谢大家!正如你们所说的那样,我试图访问未分配的内存,一个空指针。现在我有另一个问题,但这将是另一个帖子。谢谢!

4 个答案:

答案 0 :(得分:1)

问题是你的nuevo_nivel未初始化。您需要首先从堆栈或堆中分配它,如下所示:

// from stack
struct nivel nuevo_nivel;
nuevo_nivel_desde_archivo(&nuevo_nivel,nombre_archivo);

// from heap
struct nivel *nuevo_nivel = malloc(sizeof(nivel));
nuevo_nivel_desde_archivo(nuevo_nivel,nombre_archivo);

您分配的内存类型取决于您对nuevo_nivel的范围/生命周期要求。

答案 1 :(得分:1)

你的代码错了。您尚未为结构分配内存

struct nivel *nuevo_nivel;
nuevo_nivel_desde_archivo(nuevo_nivel,nombre_archivo);

应该是

 struct nivel *nuevo_nivel;
 //allocate memory
 nuevo_nivel = malloc (sizeof (struct nivel));
 nuevo_nivel_desde_archivo(nuevo_nivel,nombre_archivo);

答案 2 :(得分:1)

您以这种方式调用代码:

struct nivel *nuevo_nivel;
nuevo_nivel_desde_archivo(nuevo_nivel,nombre_archivo);

但您没有为nuevo_nivel分配任何空间,或者至少是您的代码段显示的空间。所以你在这里取消引用一个无效的指针:

nuevo_nivel->filas = 0;
nuevo_nivel->columnas = 0;

这会有效:

struct nivel nuevo_nivel;
nuevo_nivel_desde_archivo(&nuevo_nivel,nombre_archivo);

在这种情况下,nuevo_nivel将在堆栈上分配,您使用nuevo_nivel获取&的地址。如果你想在你的函数中分配空间,就必须传递像struct nivel ** nuevo_nivel这样的参数。

答案 3 :(得分:1)

问题是你没有分配内存nuevo_nivel,你声明了一个指向结构的指针并立即调用nuevo_nivel_desde_archivo(nuevo_nivel,nombre_archivo);

并在该函数内部直接访问struct成员(记住尚未分配内存)。因此分段错误。