C-通过指针分段错误从函数中获取结构
我是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
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。