2017-03-11 105 views
1

我想要做的就是使用用戶輸入使用結構指針進行基本打印。當我嘗試使用下面的代碼時,我得到segmentation fault。我是新手,無論如何。將scanf值傳遞給結構指針分割錯誤

typedef struct { 
    int *licenseNum; 
    char *name; 
    char *region; 
} City; 

typedef struct { 
    struct Node *current; 
    struct Node *head; 
    struct Node *tail; 
    struct Node *next; 
    struct Node *secondNext; 
    City *data; 
} Node; 


int main() 
{ 
    Node *node = malloc(sizeof(Node)); 
    City *city = malloc(sizeof(City)); 
    puts("License number of the City: "); 
    scanf("%d", &(node -> data -> licenseNum)); 
    printf("%d", node -> data -> licenseNum); 
    return 0; 
} 

回答

0

你沒有在node設置data

Node * node = malloc(sizeof(Node)); 
City * city = malloc(sizeof(City)); 
// node->data is not yet defined! 
// It has a random value! You must first initialize it: 
node->data = city; 

而且你不應該使用malloc這裏通過malloc具有隨機值分配的內存。只有在使用malloc時,如果您確實使用struct中的所有指針,然後才能使用它們,請使用它們。這是更安全的使用calloc

Node * node = calloc(1, sizeof(Node)); 
City * city = calloc(1, sizeof(City)); 
node->data = city; 

calloc作品像malloc,但它保證返回的內存是所有設置爲零(所有詮釋值0,所有指針都NULL)。 calloc(上面的代碼中的1)的第一個參數是要分配的項目的數量,這裏只是一個。例如。 calloc(5, sizeof(City))將在一個單獨的塊分配內存的5個城市,例如:

Cities * cities = calloc(5, sizeof(City)); 
cities[0].name = "New York"; 
cities[1].name = "London"; 
// ... and so on 
+0

就是這樣。我學到了另外一件事,非常感謝。 – Miral

+0

不應該使用'free(node)'和'free(city)'來釋放動態分配的資源嗎? –

+1

@SatyaPawan是的,他應該,但那不是問題的一部分。這將是問題「爲什麼我的代碼泄漏內存?」的一部分;-)泄漏內存對於只執行一個操作然後在退出時退出的應用程序並不一定是關鍵的,應用程序的所有分配的內存總是返回到操作系統並因此被隱式釋放,所以調用它會有什麼不同在應用程序退出前兩次「免費」?這沒有什麼區別。如果你打算讓你的應用程序運行幾個小時,你必須預算記憶當然 - 或者接受你的應用程序需要它的GB :-P – Mecki

0

你沒有初始化node->data

0

您爲node分配了內存,但不是node->data

您可能想這樣做:node->data = city