2015-06-05 63 views
-1

我在C創建一個低水平包裝函數寫:低電平寫分段故障

void MyWrite(int fd, unsigned char *buffer, unsigned int length){ 
    len=write(fd, buffer, len); 
    printf("Output Length = %u \n", len); 
} 

現在,當我送了以下內容:

MyWrite(fileDescriptor, 0, 1); 

命令引起分段故障

編輯:

我想寫的ASCII值0不是ASCII字符acter 48即'0'

+4

您傳遞一個空指針,那麼爲什麼分段錯誤令人驚訝? –

+0

所以你試圖從地址0讀取......你究竟希望通過它來達到什麼目的? –

+1

@barakmanos *從*地址'0',但仍然 – Eregrith

回答

2

是的,這很明顯。你本質上傳遞buffer爲NULL(0)。

write()將嘗試讀取從NULL地址的數據,這是最明顯的副作用將是undefined behaviour

您需要傳遞一個有效的指針,以便正確讀取數據。在編寫包裝器時,我會建議,爲包裝器內的傳入指針添加一個NULL檢查。


編輯:

如果你想要寫一個數字0,你需要通過包含該值的緩衝區。一些僞代碼:

unsigned char val = 0; 
MyWrite(fileDescriptor, &val, 1); 
+0

我想寫ascii字符0而不是ascii字符48即0 – Vineet1982

+1

@NatashaDutta是的,我認爲是這樣,最好用'unsigned'。 – Eregrith

1

如果你讀的write手冊頁,你會看到的功能預計緩衝區是一個正確的指針,因此取消引用前不會做任何檢查。

因此:

MyWrite(fd, 0, 1); 

將發送一個指針爲0,以write,這會導致它段錯誤。

你想要做的是:

MyWrite(fd, "0", 1); 

發送一個字符串的字符'0'

或者MyWrite(fd, "\0", 1);寫一個空字符(我不知道爲什麼你要,雖然)

更好的版本:

char c = 0; 
MyWrite(fd, &c, 1); 
+2

OP不需要閱讀手冊頁,從他自己的函數原型就很明顯。 –

+1

@barakmanos *每個人都需要閱讀手冊頁* – Eregrith

+0

嗯,我的意思是OP不需要閱讀手冊頁,以瞭解他將'buffer'作爲'NULL'傳遞。 –