2014-02-16 203 views
0

我試圖理解爲什麼代碼崩潰:(代碼塊C99)崩潰代碼(指針C99)

int a; 
int **b=0; 
*b=&a; 

我知道* b爲類型爲int *和&一個也詮釋*所以這裏有什麼問題?

回答

5

讓我們這樣分開:

int a; /* make a an integer, assuming this is in a function on the stack */ 
int **b=0; /* make b a pointer to a pointer to an integer, but make it point to 0 */ 
*b=&a; /* store the address of a at the address pointed to by b, which is 0 */ 

你的IE明確寫的a地址爲零的位置。問題不是類型兼容性,而是您試圖在零位存儲某些東西,這會導致seg故障。

要修復它這樣做:

int a; /* make a an integer, assuming this is in a function on the stack */ 
int *c = 0; /* make an integer pointer, initialise it to NULL */ 
int **b=&c; /* make b a pointer to a pointer to an integer, make it point to c */ 
*b=&a; /* store the address of a at the address pointed to by b, which is c */ 
2

乙組分的指針,則指向指針0/NULL,當你* B =要分配的值到地址0,這將在大多數操作系統死意義(在嵌入式系統中,這可以是根據有效處理器)

1

你解引用空指針。 b指向NULL,並在下一行中取消引用它併爲其指定一個新值。

您不允許寫入您不擁有的內存,並且您是,特別是不允許寫入NULL。

-2
#include <stdlib.h> 

int 
main() 
{ 
    int a; 
    int **b = (int**)malloc(1 * sizeof(int)); 
    *b = &a; 
    free(b); 
    return 0; 
} 

*b = &ab[0] = &a同樣的效果。

+0

他沒有使用C++ – ASKASK

+0

@ASKASK語法是這個有什麼不同?我相信這個基本概念是一樣的。 – gongzhitaao

+0

編輯你的答案,因此不具備C++,例如,刪除一切,直到第一個{和(如果你想提出這樣的想法使用malloc) –

0

int **b=0指針int *,被初始化爲NULL,並在分配的存儲區未指向。當您寫入*b時,您試圖取消引用空指針,這是非法的。

如果你要分配存儲空間,例如使用b=malloc(sizeof(*b)),那麼您需要能夠在通過b使用*b=&a寫入到區域指針,因爲那時*b將寫入到一個有效的地址。

1

你不能設置指針這樣的值(* B = &一),因爲他們是在沒有指向任何東西的時間;爲了確定他們的價值,他們必須指向某種東西。

int a; 
int *tmp; 
int **b = &tmp; 
*b = &a; //this should work because you are setting a real variable (in this case tmp) to &a