0

我在 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 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 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

4

1 回答 1

3

当你想改变函数内部的参数时,你需要传递一个指向它的指针。例如,在Rtest您内部声明了一个名为num. 它没有任何值,你将它发送到openf,但实际上你将指针发送到 ,num因为你想改变它的值,你做得正确并且确实成功地openf改变了num值。

但是怎么样array?好吧,你声明了它Rtest并为它分配了内存空间,这都是正确的。然后,您想将其Rtest作为指针发送到,以便函数可以更改它。 array是“指向结构个体的指针”类型的变量。这没关系,但是如果您想在内部更改它Rtest,那么您需要为该变量发送一个指针。因此,您需要一个“指向结构个体的指针”。请注意,变量名称是从之前复制的,我只是添加了“POINTER TO”

我确定您知道指针的指针是什么,您需要做的是使用:

openf(&array, &num);

当然还有修改openf,所以它会使用新的“指向指针的指针”,就像这样:

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);

}

当我在我的机器上运行此代码时,Rtest如果save.bin我得到以下输出:

53
Carlson
Carlson
Carlson
3
Carlson
Carlson
Carlson

编辑:正如@WhozCraig 在评论中提到的那样,您可以使用未使用的函数返回值并返回“新”数组的指针,这可能是一种更好的做事方式,而不是“指向指针的指针”东西,但它取决于你。

于 2021-01-30T19:06:09.560 回答