Ryan_Li 发表于 2021-3-17 21:06:11

为什么这里的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:20:34

本帖最后由 baige 于 2021-3-17 21:22 编辑

很好奇编译器会给过?
dev,vs直接报错了,至少需要sno吧
char sno;
数组开大点;放'\0'

jackz007 发表于 2021-3-17 21:29:15

本帖最后由 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 定义成一样。

Ryan_Li 发表于 2021-3-17 23:03:34

我的dev c++确实给过了....所以出现两遍name就是因为放不下\0了,刚好name和sno相邻的内存空间,所以直接翻译到name那里去了,直到name的\0结束然后name那里printf的时候又printf了一遍 对吗
页: [1]
查看完整版本: 为什么这里的name字符数组会输出两遍