繁体   English   中英

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

[英]C - Getting a struct from a function by pointer - 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 ){
 nuevo_nivel->filas = 0;
 nuevo_nivel->columnas = 0;
 ...

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

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

Nombre_archivo仅保存文本文件的名称。 当我尝试将cero分配给该结构的任何字段时,出现分段错误错误。 从我现在关于指针的角度来看,它应该起作用,但是恐怕我在这里丢失了一些东西并犯了一个大错误。 任何帮助,将不胜感激。

编辑:谢谢大家! 正如大家所说,我试图访问未分配的内存,即空指针。 现在我有另一个问题,但这将是另一篇文章。 谢谢!

问题是您的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的范围/寿命要求。

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

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这样的参数。

问题是您尚未分配内存nuevo_nivel ,您声明了该结构的指针,然后立即调用nuevo_nivel_desde_archivo(nuevo_nivel,nombre_archivo);

在该函数内部,您可以直接访问struct成员(记住尚未分配任何内存)。 因此,分割错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM