为什么这里的name字符数组会输出两遍
#include <stdio.h>typedef struct student{
char sno;
char name;
int age;
float enscore;
}STUD;
void PrintStud(STUD *p,int n){
int i;
for(i=0;i<n;i++){
printf("%s\t %s\t %d\t %.1f \n",p.sno,p.name,p.age,p.enscore);
}
}
int main(){
STUD s={
{"1244","dav",18,97.5},
{"1234","dasd",19,97.5},
{"1574","ace",20,97.5},
{"1884","qew",17,97.5},
{"1884","qew",17,97.5}
};
PrintStud(s,5);
return 0;
}
为什么这里的name字符数组会输出两遍 输出结果如下
1244davdav 18 97.5
1234dasd dasd 19 97.5
1574aceace 20 97.5
1884qewqew 17 97.5
1884qewqew 17 97.5
--------------------------------
是什么问题导致的呢 本帖最后由 baige 于 2021-3-17 21:22 编辑
很好奇编译器会给过?
dev,vs直接报错了,至少需要sno吧
char sno;
数组开大点;放'\0' 本帖最后由 jackz007 于 2021-3-17 23:01 编辑
char sno; // 这样定义 sno 可储存字符串的最大长度是 3 个字符,一旦超过就会出乱子
sno 与 name 存储空间相邻,而且 sno 在前,name 在后,由于 sno 存储空间定义小了,不够存储 5 个字符(4 + '\0')的内容,于是,越界侵入后面 name 的存储空间,造成 sno 与 name 粘连为一体,从 sno 访问,得到 sno + name 的内容,从 name 访问,得到 name 的内容,所以,每条记录 name 都会被打印两次。
char sno; // sno 需要储存 4 个字符,至少需要5 个字符的存储空间,索性就和 name 定义成一样。
我的dev c++确实给过了....所以出现两遍name就是因为放不下\0了,刚好name和sno相邻的内存空间,所以直接翻译到name那里去了,直到name的\0结束然后name那里printf的时候又printf了一遍 对吗
页:
[1]