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

C-通过指针分段错误从函数中获取结构,c,pointers,struct,segmentation-fault,C,Pointers,Struct,Segmentation Fault,我是C语言的新手,这个函数给我带来了很多麻烦。我将结构声明为: struct nivel { size_t filas; size_t columnas; int **mapa; }; 它只是一个二维数组,带有大小信息。现在,我有一个函数,它读取一个文本文件并生成一个“nivel”,它的定义是: void nuevo_nivel_desde_archivo(struct nivel * nuevo_nivel, char *nombre_archivo ){ nuev

我是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分配给结构的任何字段时,会出现分段错误。从我现在关于指针的内容来看,它应该是有效的,但我担心我在这里遗漏了一些东西,犯了一个巨大的错误。任何帮助都将不胜感激


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

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

// 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\u nivel的作用域/生存期要求。

问题在于您的nuevo\u 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的作用域/生存期要求。

您的代码是错误的。您尚未为结构分配内存

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);

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

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);

您以这种方式调用代码:

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

,这样调用代码:

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

,问题是您没有分配内存
nuevo nivel
,您声明了指向该结构的指针,并立即调用
nuevo nivel\u desde\archivo(nuevo nivel,nombre\archivo)


在这个函数中,您可以直接访问struct成员(记住还没有分配内存)。因此分割错误。

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


在这个函数中,您可以直接访问struct成员(记住还没有分配内存)。因此分割错误。

您是否检查
nuevo_nivel
是否为
NULL
?呼叫代码在哪里?如果你能提供一个小的代码示例,那么编译并产生的问题会很有帮助。@Shafik调用函数的代码就在那里,这是文章中的第三个块代码。在第一个代码块中将任何内容分配给结构的任何字段时,都会产生错误。您是否正在检查
nuevo\u nivel
是否为
NULL
?呼叫代码在哪里?如果你能提供一个小的代码示例,那么编译并产生的问题会很有帮助。@Shafik调用函数的代码就在那里,这是文章中的第三个块代码。在第一个代码块中,将任何内容分配给结构的任何字段时,都会产生错误。。。我必须在填充指针的函数中这样做,对吗?因为数组的大小是通过逻辑确定的……不,您不能从函数内部执行此操作,除非您传递指针的地址以影响调用方的值。相反,你可能会考虑一个“工厂”的方法——改变Nueovi-NiVeldDeSoCiVio来实际返回一个NIVEL*,完全构建。我看到:-现在我遇到了一个“双链表损坏”的错误,但这将是另一个问题。谢谢等一下,这篇文章的标签是
C
,你如何使用
new
?如果这是一个C++答案,那么我们应该通过引用,所以答案仍然是错误的。@ SafikyKaGigMang-GOMD -我的C++偏向爬行。我编辑了答案来使用malloc。哦,我明白了。。。我必须在填充指针的函数中这样做,对吗?因为数组的大小是通过逻辑确定的……不,您不能从函数内部执行此操作,除非您传递指针的地址以影响调用方的值。相反,你可能会考虑一个“工厂”的方法——改变Nueovi-NiVeldDeSoCiVio来实际返回一个NIVEL*,完全构建。我看到:-现在我遇到了一个“双链表损坏”的错误,但这将是另一个问题。谢谢等一下,这篇文章的标签是
C
,你如何使用
new
?如果这是一个C++答案,那么我们应该通过引用,所以答案仍然是错误的。@ SafikyKaGigMang-GOMD -我的C++偏向爬行。我编辑了答案以使用malloc。