【发布时间】:2021-05-04 09:35:40
【问题描述】:
我在 C 中遇到了(我认为)内存重新分配的问题。该程序旨在运行时,当调用 fopen(array, &num); 时,它将首先从文件中检索数组中的元素数量并将其放置在 num 中,为给定的数组指针重新分配内存,为其提供足够的空间来正确存储文件的内容,然后将值复制到该数组中。这似乎在 fopen 函数中仍然有效(由“标记 1”显示),但在此之外不起作用(由“标记 2”显示),而是似乎喷出随机内存垃圾。任何帮助表示赞赏(包括代码和格式化我布局不佳的问题)。
//main.c
void Rtest(){
char num;
struct individual *array;
array = (struct individual *) malloc(sizeof(struct individual));
openf(array, &num);
printf("%d\n", num);
for (int i = 0; i < num; i++) {printf("%s\n", array[i].name);} //mark 2
free(array);
}
//fil.h
struct individual {
char name[32];
char stats[7];
char role;
char roles[13];
};
void openf(struct individual *array, char *num){
FILE *fp;
fp = fopen("save.bin", "rb");
fread(num, 1, sizeof(char), fp);
array = (struct individual *)realloc(array, *num * sizeof(struct individual));
printf("%d\n", sizeof(*array));
fread(array, *num, sizeof(struct individual), fp);
for (int i = 0; i < *num; i++) {printf("%s\n", array[i].name);} //mark 1
fclose(fp);
}
文件内容:
03 43 61 72 6C 73 6F 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 02 03 04 055 06 0 300 0 05 06 0 08 0 06 07 08 09 0A 0B 0C 43 61 72 6C 73 6F 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 02 03 04 05 06 08 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 43 61 72 6C 73 6F 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 02 03 04 05 06 08 00 01 02 03 04 05 06 07 08 09 0A 0B 0C
【问题讨论】:
-
在
openf中,代码array = (struct individual *)realloc....对openf的调用者 没有任何意义,除了可能(实际上很可能)悬空的指针值是传入这个函数。调用者Rtest中array的原始值仍然存在,但现在不再有效;因此“悬空”。顺便说一句,为什么num是char?我的意思是,它可以工作,但非常有限。而且我还认为您停止假设您的所有 IO 都正常工作。这是一种糟糕的做法。 -
@WhozCraig num 是一个字符,因为我有点傻。那么解决方案是将其分成两部分,在 Rtest 中重新分配内存吗?
-
如果意图是
openf可能会更改该指针的值,并且您希望该更改反映回调用者,那么您可以设计一种方法来做到这一点。使用函数的其他未使用的返回值,或通过地址传递原始指针(指向指针的指针,并在更改指向的指针时在openf中取消引用),都是该场景的常见解决方案。
标签: arrays c file memory-management structure