C语言 struct结构体 发现的一个问题 百思不得其解,求大神为我解惑

代码如下

#define _CRT_SECURE_NO_WARNINGS//vs报scanf警告
#include<stdio.h>
#include<string.h>

struct Student
{
    char name[20];
    char age;
    char sex;
};
int main() {
    struct Student st[] = { {"aaa",25,1},{"bbb",40,0}, {"ccc",30,1},{"ddd",34,1},{"eee",79,0} };//声明且初始化
    int num = sizeof(st) / sizeof(st[0]);//计算出成员数量
    printf("%d\n", sizeof(st));//这里输出结构体数组st所占的内存大小,这里是110byte,5个成员,每个成员22byte
    for (int i = 0; i < num; i++)//冒泡排序,以年龄排序
    {
        for (int j = 0; j < num - i; j++)
        {
            if (st[j].age > st[j + 1].age)
            {
                st[num] = st[j];//这里我突发奇想把大的放置在数组后面,程序运行起来没问题,不知道实际上能不能这样???
                st[j] = st[j + 1];
                st[j + 1] = st[num];
            }
        }
    }
    scanf("%20s", st[5].name);//向数组添加新成员
    scanf("%d", &st[5].age);
    scanf("%d", &st[5].sex);
    num = sizeof(st) / sizeof(st[0]);//问题来了!这里怎么还是5,不是6呢????那怎么输出新成员的信息呢???
    printf("%d\n", sizeof(st));
    for (int i = 0; i < num;i++)
    {
        printf("%s,%d,%d\n", st[i].name, st[i].age, st[i].sex);
    }
    return 0;
}

c

3个回答

 struct Student st[] = { {"aaa",25,1},{"bbb",40,0}, {"ccc",30,1},{"ddd",34,1},{"eee",79,0} };  数组初始化时就是[5],数组下标是 0 - 4

 if (st[j].age > st[j + 1].age)  //可以实现年龄从小到大。。



u012317668
懒得动 大哥,你是对的,一开始我没懂你的意思,查了半天资料,才弄明白
3 年多之前 回复
u012317668
懒得动 为什么st数组的大小却没变?
3 年多之前 回复
u012317668
懒得动 哥,我不是问怎么排序,我的问题是,我添加了新成员st[5]
3 年多之前 回复

你要倒序排也是可以,if就要变成。

u012317668
懒得动 哥这不是重点好吗?
3 年多之前 回复

查了半天资料,看到数组的定义时和初始化才反应过来,char a[]={1,2,3,4}时方括号里没填数字不代表没有数字,编译器会根据后面{}里的值,自动帮你填一个数字,这里就是4,所以,数组定义并初始化后,数组的大小就已经固定了,因此,我上面源代码中突发奇想的方法是错误的,这应该已经造成了内存的溢出,只是这块内存没有用到,所以没有报错,我实验了一下 ,把st[i]中的i填一个很大的值,运行程序果然报错了,晕,搞了半天还是基础不牢啊

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐