2012-03-30 70 views
1

我迷路了。我無法將int分配給取消引用int *無法將int分配給C中的取消引用int

printf("in octave\n"); 

    int *default_octave; 
    printf("attr[%d]: %s\n",i+1,attr[i+1]); 

    const char *octave_char = attr[i+1]; 
    printf("octave_char: %s\n", octave_char); 

    int octave_number = atoi(octave_char); 
    printf("octave_number: %d\n", octave_number); 
    fflush(stdout); 

    *default_octave=octave_number; 
    printf("in octave pt 2\n"); 
    fflush(stdout); 

這是輸出:

in octave 
attr[1]: 4 
octave_char: 4 
octave_number: 4 
Segmentation fault 

爲什麼?

運行GDB調試器獲取到該行,然後賽格故障了。

0   int octave_number = atoi(octave_char); 
(gdb) s 
41   printf("octave_number: %d\n", octave_number); 
(gdb) 
octave_number: 4 
42   fflush(stdout); 
(gdb) 
43   *default_octave=octave_number; 
(gdb) print octave_number 
$1 = 4 
(gdb) s 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400a7b in parse_song (song_data=0x7fffffffe7a8, attr=0x602600) at nullaby.c:43 
43   *default_octave=octave_number; 
(gdb) 

我不知道我能做些什麼來解決這個問題。

回答

3

您有一個int pointer。對。

這只是意味着你有一個變量指向一些內存區域。
但是您還沒有分配/保留該內存區域。所以它可以指向任何東西。

而且它必將指向你沒有自己的存儲區域,因此分段錯誤。

您需要爲指針分配內存...

例如:

int * default_octave = malloc(sizeof(int)); 

或者你也可以使用:

int default_octave_val; 
int * default_octave = &default_octave_val; 

要麼你分配內存來存儲您的INT (然後獲取指向有效內存區域的指針),或者創建一個指向現有內存區域的指針(在給定示例中爲堆棧地址)。

然後你可以去參考該指針,它指向一個有效的存儲區。
如果不這樣做,則根據操作系統的不同,會出現分段錯誤或總線錯誤。

+0

謝謝你給我一個指針頓悟。一切都很有意義,關於指針,堆棧和堆...... – twmb 2012-03-30 00:37:52

+0

當然......)但是在這裏,沒有首選的方式......這一切都取決於操作系統試圖實現什麼......作爲一個指針可以指向任何東西,它可以指向堆棧地址或堆地址...只需要指向一個有效的地址,如果你想解除引用它... – Macmade 2012-03-30 00:39:10

+0

一個沒有問題的投票計數,只要他得到他需要的答案...:) – Macmade 2012-03-30 00:39:54

6

它會發生段錯誤,因爲您從不初始化default_octave指向任何可以存儲int的內容。

+0

例如,可以分配另一'int'對象,'default_octave =&another_octave',也可以爲它自己分配內存,例如地址''default_octave = malloc(sizeof(int));'(後來必須用'free(default_octave);'釋放,並且只爲一個'int'分配內存並不是那麼有用)。 – dreamlax 2012-03-30 00:34:00

+0

@OliCharlesworth:我降低了投票權,但已經被刪除。我發現你是C專家,這對你來說是一個非常基本的問題。然而,我不覺得這個答案對OP來說很有用。儘管如此,在James McLaughlin之後很快就發現了這個問題。 – bernie 2012-03-30 00:45:52

+0

@bernie:夠公平的。我的政策是編寫回答問題的最低職位;如果OP不明白,他們總是歡迎發表評論,我會澄清。 – 2012-03-30 00:47:53

相關問題