这有点复杂 我能解释 但我估计你看不懂
printf是不定参数函数
第一个参数 会按照char*类型入栈
后面的参数 你怎么写就怎么入栈
然后根据第一个参数的格式控制字符串
从栈里面获取数据 进行输出
第一个printf
入栈了一个int 和 一个char*(数组char[3]隐式转换为指向b[0]的char*)
printf在执行的时候
解析到 %d 从栈里读取一个int 然后输出
解析到 %s 从栈里读取一个char*
然后从这个char*指定的内存地址开始按照char输出数据 直到遇到'\0'
这个char*如前面所说指向b[0] 所以输出数组b的内容
第一个printf的行为就是这样没什么问题
第二个printf
入栈了一个 struct student 展开来说就是 一个int 和 一个char[3] (暂不考虑内存对齐)
printf在执行的时候
解析到 %d 从栈里读取一个int 然后输出
解析到 %s printf会从栈里面读取一个char* 但是入栈的数据并没有char* 而是一个char[3]
这里详细说一下读取一个char*是什么意思
假设char* 是4个字节 读取一个char* 意思是从栈里面读取4个字节的数据 并把读取出来的数据作为一个char*解析
现在栈里面只有char[3] 读取4个字节的数据 会造成数组越界 并且把读取出来的数据作为一个char*解析
就是说b[0]做完char*的第一个字节的数据 b[1]作为char*第二个字节的数据 .......
这样组合出一个char* 然后按照组合出来的char*输出字符串
这显然是胡作非为了