2015-02-05 65 views
-5

我有下面這段代碼:賽格故障時或操作

#include <stdio.h> 
#include <inttypes.h> 
#define PORT_TYPE 0x01000000 
main(){ 
    uint32_t port_id = 0x0; 
    uint32_t *iptr = NULL; 
    iptr = (uint32_t *) (sizeof(uint32_t)); 
    *iptr = (PORT_TYPE | port_id); 
} 

它扔我賽格故障。我打算把OR變量都變成32位的值(0x01123456)

+4

爲什麼解引用空指針給你分段錯誤,嗯...... – zubergu 2015-02-05 15:20:02

+0

@zubergu - 對不起,在我看到它之前編輯了問題。 – 2015-02-05 15:31:51

+0

@MartinJames但問題是幾乎相同,除了現在你不是解除引用NULL,你解引用地址4,這仍然是一個veeery壞主意。考慮與我們分享,你想達到的目標,這樣我們就不會接近幫助你。 – zubergu 2015-02-05 15:42:49

回答

2

這個問題有要做OR操作。

這裏的問題是,您正在嘗試解除引用NULL內存,導致undefined behaviour顯示分段故障的副作用。

在您的代碼中,您已將iptr設置爲NULL。你不應該訪問NULL內存。你必須分配內存iptr之前,你實際上使用它。

試試這個

uint32_t *iptr = NULL; 
iptr = malloc (sizeof (uint32_t *)); // allocate memory dynamically. 

if (iptr)        //check for success of malloc 
    *iptr = (PORT_TYPE | port_id); 
else 
    // don't use iptr, do something else, or return. 

,一旦您完成後,不要忘了free()內存。

注意:另外,最好使用int main()return聲明。


編輯:

按您最新的編輯,

iptr = (uint32_t *) (sizeof(uint32_t)); 

分配memeory。

+0

在給它賦值之前用下面的語句分配內存之後,編譯器仍然會拋出seg錯誤。 iptr =(uint32_t *)(sizeof(uint32_t)); – 2015-02-05 15:22:01

+1

@RajS'(uint32_t *)(sizeof(uint32_t))'不分配內存。 – emlai 2015-02-05 15:28:07

+0

@RajS你是否嘗試過我的方法來分配內存? – 2015-02-05 15:28:50

1

你試圖通過一個NULL指針寫:

*iptr = <anything> 

會導致分段錯誤,因爲IPTR點爲NULL。你不能寫NULL。

+0

在給它賦值之前用下面的語句分配內存之後,編譯器仍然會拋出seg錯誤。 'iptr =(uint32_t *)(sizeof(uint32_t));' – 2015-02-05 15:23:21

4

您正在取消引用指針iptr,其值不是有效的可寫內存位置。這觸發了未定義的行爲,在你的情況下是分段錯誤。

要計算該值,您可以

printf("0x%08x\n", PORT_TYPE | port_id); 

要計算的指針是PORT_TYPEport_id的按位或,你可以這樣做:

uint32_t *iptr = (uint32_t *) (PORT_TYPE | port_id); 

演員是必要的,因爲是按位或值:ED不是指針(你不能按位或指針)。

注意上面永遠取消引用的結果指針,因爲沒有擔保(它是,在一般情況下,不太可能),這樣做將是有效的。

+1

@HolyBlackCat問題已被編輯。現在它更加陌生。謝謝。 – unwind 2015-02-05 15:30:17

1

更換*iptriptr分配給iptr

iptr = (PORT_TYPE | port_id); 

這會的(PORT_TYPE | port_id)結果分配給iptr


使用*iptr將在地址(uint32_t *) (sizeof(uint32_t))(等於4,一個荒謬的內存地址的變量,在大多數系統上),這就是爲什麼賽格故障發生已分配的內存。


爲了動態分配內存以iptr

iptr = malloc(sizeof(uint32_t)); 

這將分配sizeof(uint32_t)字節的存儲器和存儲器的地址分配給iptr

+0

爲什麼所有這些其他答覆錯過iptr被分配了一些東西(在大多數系統上同樣無用),在NULL之後? – 2015-02-05 15:27:22

+0

@MartinJames OP在之後修改了代碼。起初它是'NULL'。 – emlai 2015-02-05 15:28:57

+0

啊...哦...我downvoted其他答案:(現在我必須扭轉它:) – 2015-02-05 15:30:21