#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);
}
运行结果如下:
可以看出调整分配后字符数组下标为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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:定义:
以前顺序结构中,每个数据元素只需要存数据元素就可以了,但链式结构中,为了将链表连接起来,每个元素不仅要存储数据元素信息,还需要存储它的后继元素的存储地址。