C语言realloc调整分配内存出现的内存变化问题

#C语言用realloc为字符数组重新分配空间时改变了原字符数组的内存,请问是怎么回事?
代码如下:

#include 
#include
struct stu {//创造结构体
    char name;
    int age;
    char number[];
} ;
int main() {
    int i = 5;
    struct stu* s1 = (struct stu*)malloc(sizeof(char) + sizeof(int) + sizeof(char) * i);//为结构体开辟空间,空间为5
    for (int j = 0; j < i; j++) {//为结构体中的字符数组赋值
        s1->number[j] = j;
    }
    for (int j = 0; j < i; j++) {//以整型打印结构体中的字符数组
        printf("%d ", s1->number[j]);
    }
    printf("\n");
    i = 10;
    struct stu* s2 = (struct stu*)realloc(s1, sizeof(struct stu)+i*sizeof(char));//重新分配字符数组的空间,扩大至10
    if (s2 != NULL) {
        s1 = s2;
    }
    for (int j = 5; j < i; j++) {//为扩大的空间赋值
        s1->number[j] = j;
    }
    for (int j = 0; j < i; j++) {//以整型打印重新分配空间的字符数组
        printf("%d ", s1->number[j]);
    }
    free(s1);
}

运行结果如下:

img


调试时字符数组初始内存:

img


调试时字符数组调整内存:

img

可以看出调整分配后字符数组下标为2,3,4的内存并没有复制过去,所以输出的时候出现了随机值,请问这是怎么回事,或者代码应该怎样才能达到预期效果?感谢答疑!

这段代码的正确写法可以参考如下我的实现;

#include <stdio.h>
#include <stdlib.h>

struct stu {
    char name;
    int age;
    char* number;  // 将字符数组改为指针类型
};

int main() {
    int i = 5;
    struct stu* s1 = (struct stu*)malloc(sizeof(struct stu) + sizeof(char) * i);
    // 计算结构体大小时应该包括指针类型的字符数组,注意乘号位置

    s1->number = (char*)malloc(sizeof(char) * i);  // 为指针分配内存空间

    for (int j = 0; j < i; j++) {
        s1->number[j] = j;
    }

    for (int j = 0; j < i; j++) {
        printf("%d ", s1->number[j]);
    }
    printf("\n");

    i = 10;
    struct stu* s2 = (struct stu*)realloc(s1, sizeof(struct stu) + sizeof(char) * i);
    // 重新分配空间时也要包括指针类型的字符数组

    if (s2 != NULL) {
        s1 = s2;
        s1->number = s2 + 1;  // 重新设置字符数组指针
    }

    for (int j = 5; j < i; j++) {
        s1->number[j] = j;
    }

    for (int j = 0; j < i; j++) {
        printf("%d ", s1->number[j]);
    }

    free(s1->number);  // 释放指针所指向的内存空间
    free(s1);
    return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^