2010-11-02 84 views
1

嗨我想在一個結構中使用指針程序。編譯器似乎沒有問題,但程序崩潰。 你能幫我嗎?結構指針?出了點問題

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 

int pos; 

typedef struct _Parking Parking; 

struct _Parking 
{ 
    int pos;  
    char name[15];  
    char description[80]; 
    float price;   
    int slots[5];  
    char last_driver_id;  
    int reservations; 
}; 

Parking *myaccounts; 

int create_Parking() 
{ 
    strcpy(myaccounts->name,"Pro"); 
    myaccounts->pos ++; 

    return pos-1;    
} 

int main() 
{ 

    int a; 

    a = create_Parking(); 

    printf("a=%d\n",a); 
    printf("name=%s\n",myaccounts->name); 

    system("pause");  
    return 0;  
} 
+0

語言?添加標籤。 – 2010-11-02 13:36:37

+1

@ user494766:如果你有多一個答案(你應該),你應該「接受」你最好的一個答案。 – 2010-11-02 16:43:43

回答

8

你myaccounts指針被初始化爲NULL(作爲全局變量)。它不是指向的可用存儲器。嘗試使用malloc的手冊頁獲取更多信息。

編輯:納入Maciej的評論。

+1

看起來像'myaccounts'是一個全球性的。全局變量初始化爲零,不是嗎? – 2010-11-02 13:40:37

+0

@Maciej:你說得對。我會更新答案的措詞。 – 2010-11-02 13:44:36

+2

零初始化指針不是有效指針。此外,零初始化或不,我不會建議使用未明確初始化的變量。 – 2010-11-02 13:46:13

6

您從不爲「myaccounts」分配任何內存。

0

你的指針不指向任何東西。您可以嘗試使用其中的任何一個:

Parking myaccountsInstance; 
Parking *myaccounts = &myaccountsInstance; 

還是在主要功能:

開始:

myaccounts = (Parking*)malloc(sizeof(Parking)); 

並結束與:

free(myaccounts); 
+0

請不要教人們忽略'malloc'的錯誤情況。 – 2010-11-02 14:13:38

+0

非常感謝您的回答。它的工作現在完美。 – user494766 2010-11-02 14:47:59

+0

'malloc'的返回值的轉換實際上是有害的。有關原因的更多信息,請參閱http://www.cpax.org.uk/prg/writings/casting.php。 – 2010-11-02 15:14:20

3

指針用C做不指向有效的內存(並且如果你嘗試使用它們,會崩潰),直到你用t來特別指出它們在某個地方是有效的他在一個對象(&)上尋址操作符,或者通過爲它們分配內存並將該地址分配給指針(malloc()和朋友)。當然,如果使用地址 - 運算符,那麼當對象超出範圍時,該位置可能會失效。如果您使用malloc(),那麼當調用free()時,該位置可能會失效。無論哪種情況,您的指針都會再次失效。你也可以指望你寫的任何大小的C代碼有一個或兩個這樣的性質,直到你跟蹤它們並修復它們爲止。通過C編譯器獲取源代碼並不意味着太多。如果你想用一種語言來編寫代碼,那麼你第一次運行它的代碼在通過編譯器後運行它,你需要Ada。