2

我是 C 的新手,我在使用这个函数时遇到了很多麻烦。我有一个声明为的结构:

struct nivel {
    size_t filas;
    size_t columnas;
    int **mapa;
};

它只是一个二维数组,带有它的大小信息。现在,我有一个读取文本文件并制作“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

4 回答 4

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 的范围/生命周期要求。

于 2013-05-02T17:00:34.683 回答
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);
于 2013-05-02T17:01:07.630 回答
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_nivelusing的地址&。如果您想在函数内分配空间,则必须像这样传递参数struct nivel ** nuevo_nivel

于 2013-05-02T17:01:26.500 回答
1

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

在该函数中,您可以直接访问结构成员(请记住尚未分配内存)。因此分段错误。

于 2013-05-02T17:01:40.560 回答