記錄這個問題主要原因是在我c、c++ 混用的時候read 讀取數據時修改了c++類第一個屬性成員的值感到好奇, 經過他人指點才理解這個問題如何發生的,中間也經歷過許多錯誤的猜想, 總結一下經驗。
linux read函數可以使用man read 來查看man文檔, 使用代碼如下:
<code>
include <stdio.h>
include <unistd.h>
include <string.h>
int main(){
char buff[11] = {0};
while(read(0, buff, 10) >= 0){
for(int i = 0; i < sizeof(buff); i++){
printf("%d ", buff[i]);
}
bzero(buff, sizeof(buff));
puts("");
}
}
</code>
在這里可以輸入字符查看輸出內容, 比如這樣:
Paste_Image.png
從輸入和輸出可以看到read只會讀取第三個參數size-1個字符, 最后一個會置為0也就是‘\0’, 如果第三個參數size等于buff的大小的話,在第三次操作最后一個參數的值會變成113, 后面會有一個0, 但是溢出了,buff中將會看不到如下圖:
Paste_Image.png
這個溢出的'\0' 可能會修改一些區域的值, 或許什么也不做, 也就是發生了c語言說的未定義行為。