簡體   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