2010-05-23 169 views
1

爲什麼這個工作?C指針問題,解引用崩潰

int *var; 

while(scanf("%d", &var) && *var != 0) 
     printf("%d \n", var); 

雖然這不?

int *var; 

while(scanf("%d", &var) && var != 0) 
    printf("%d \n", var); 

*(取消引用操作符)不會給你指針指向的值嗎?那麼爲什麼 * var!= 0會使程序崩潰,而var!= 0不會呢?


這工作:

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

while(scanf("%d", var) && *var != 0) 
    printf("%d \n", *var); 

上做下的進修課程,很高興我做到了。

我意識到scanf(& var)是用於常規變量,而scanf(var)用於指針。但完全忘記了內存,謝謝!

+1

當您向程序中輸入數據時,您如何知道您輸入的是有效地址? – WhirlWind 2010-05-23 22:18:13

+0

有效的地址?我輸入一個整數,我不是嗎? – jn1kk 2010-05-24 01:27:32

回答

0

您將一個int *傳遞給sscanf,而不是int **。從第一個聲明中刪除*或將它初始化爲像malloc(sizeof(int))之類的東西,並從sscanf調用中刪除&。

3

我不確定你的意思是「作品」,但第一個是錯誤的,因爲你正在採取什麼樣的var指向並在第一個例子中將它比作零,並且因爲var已經初始化爲什麼用戶輸入,什麼var指向不可能是一個有效的地方。

*var != 0 

這需要由用戶定義的var指向的值。

請注意,在scanf中,您正在將整數掃描爲int **,而不是int *,而printf使用%d打印指針而不是整數。

當你因各種原因做未定義的事情時,事物可能似乎工作或失敗。你應該明白爲什麼你寫的代碼是正確的,而不是放下一些代碼,並改變它直到它工作。

+1

這並不是var沒有被初始化,而是它被初始化爲用戶輸入的數字,所以它不可能指向有效的內存地址。 – sepp2k 2010-05-23 22:12:15

+0

sepp2k我的錯誤 - 已更新。 – WhirlWind 2010-05-23 22:14:16

0

在這兩種情況下,您都通過scanf()int的地址,其中格式字符串使其期望int本身。
所以我會說他們都援引未定義的行爲。第一個崩潰而第二個崩潰只是其中許多方式之一。它也可能是相反的,或者兩者都崩潰,或者沒有,或者沒有,除非你沒有看,或者沒有滿月。未定義的行爲可以完成所有這些工作。

0
(1) int i; // reserves an integer 
(2) scanf("%d",&i); // writes to the address of i 
(3) int *var; // is a pointer pointing to some unpredictable place 
(4) int *var = &i; // would point exactly to the adress of i 
(5) scanf("%d",var) // would be the same as (2)