[英]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.