2016-04-26 41 views
-3
#include <stdio.h> 

int main() 
{ 
    int* n; 
    *n = 20; // causes the crash 
    printf("%d\n", *n); 
    return 0; 
} 

但出於某種原因,如果我先設置INT * N =然後我就可以用*更改值N = 20 有沒有這個原因?設置一個值,指針會導致程序崩潰

int i = 19; 
int* n; 
*n = i; 
*n = 20; 

編輯:謝謝大家幫助我從你的答案中學到了很多東西。

+5

它*訪問一個空指針會導致程序崩潰*。 –

+1

你有一個指向無處的指針並存儲它指向的值。問:你在哪裏存儲價值? – Olaf

+1

注意,第二個例子是一樣異乎尋常的第一個例子壞,並調用未定義的行爲,就像第 - 您使用的是未初始化的指針,當你這樣做,可以發生任何事情。不能保證當你做錯事情時程序會崩潰,但這是常見的反應。另一個常見的反應是它似乎有效,但它所做的不是你想要的。 –

回答

4
int* n; 
*n = i; 

不,你所看到的(在你的兩個例子中)是undefined behavior的結果。你上面沒有初始化的指針指向一個有意義的記憶 - 通過應用*操作你解引用指針,告訴它寫一些值到內存它,但因爲你沒有做它點到有效內存 - 您無法通過該指針進行寫入。

這將是罰款

int x = 0; 
int* n = &x; // Now your pointer points to valid memory 
*n = 5; // Value of x will be 5 now 
1

是的,是有原因的。當你聲明:

int* n; 

指針n顯示無處。因此,當您嘗試通過設置其值

*n = 20; 

程序崩潰,因爲您試圖訪問顯示無處指針的內容。


在另一方面,當你聲明

int i = 19; 
int* n; 
n = &i; 

你使指針n展示給一些有效的地址。所以,當後來分配

*n = 20; 

你真正訪問一個有效的內存地址的內容。

+0

你忘了讓我指點我 –

+0

@Giorgi謝謝指出! – Marievi

+0

應該是'n =&i' – yano

-1

你爲什麼不能設置使用該指針的值的原因是因爲它沒有指向的內存地址呢,你需要使用malloc和給它的東西指向。

希望這有助於:d

E.g

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

int main(int argc, char *argv[]) 
{ 
    int *n; 

    n = malloc(sizeof(int)); 

    *n = 20; 

    printf("n = %d\n", *n); 

    system("pause"); 

    return 0; 
} 
相關問題