记录这个问题主要原因是在我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>
在这里可以输入字符查看输出内容, 比如这样:
从输入和输出可以看到read只会读取第三个参数size-1个字符, 最后一个会置为0也就是‘\0’, 如果第三个参数size等于buff的大小的话,在第三次操作最后一个参数的值会变成113, 后面会有一个0, 但是溢出了,buff中将会看不到如下图:
这个溢出的'\0' 可能会修改一些区域的值, 或许什么也不做, 也就是发生了c语言说的未定义行为。