《一起由struct引发的C/C++内存分配和IO的思考》

1. 奇奇怪怪的BUG

代码:

#include <iostream>
using namespace std;
struct Student{
    char num[3];
    char name[20];
}student;
int main(){
    cin >>  student.num;
	cin >> student.name;
	cout << student.num << endl;
    return 0;
}

输入:111 name

输出:111name

2. 上述BUG产生的原因

​ 之前看到一个数据说:C/C++项目的bug,80%都是源于内存错误。之前以为是但是很多时候真的是因为有些错误实在是不明显。

例如在上述bug中,num定义为char 3, name 定义为char 10。并且在输入的时候也没有什么问题

但是因为输入的num是三位数,并且cin在直接对char*类型输入时会在末尾设置一位’\0’。

但是在struct中,内存是分配在一起的,因此当输入的字符,超过了3位时,‘/0’。刚好赋值在了name的起始位置。但是因为name是之后输出的,所以原本属于num的终止符‘/0’。被name覆盖了。所以在输出num的时候,内存中的实际分布是”111name\0“;而C/C++的输出机制是遇到 ‘\0’才终止,因此