gpt4 book ai didi

c - 添加到 malloc 数组的值将成为 malloc 数组中的所有值

转载 作者:行者123 更新时间:2023-11-30 20:02:32 35 4
gpt4 key购买 nike

我已经编写了这个函数(如下)。它应该逐行读取文件。编辑该行并将某些单词/字符放入各种功能中。然后将这些函数放入“entrant”结构的数组(malloc)中。

问题是,当我退出循环并尝试打印数组时,放入数组中的最后一个结构名称变量是唯一打印出来的名称变量。例如,如果我尝试打印数组的前 10 个结构名称变量,则最后一个结构名称变量将打印 10 次。然而,整数(数字变量)工作正常。

我使用 fgets() 读取文件行,并在文件末尾处退出循环。可能 fgets() 可能是问题所在,但这似乎不太可能......

我不知道问题是什么,但正如我所说,数字变量打印得很好,但名称只打印出最后一个。

但从文件中获取信息则不然。如果将我的循环打印语句放入 while 循环中,它仍然不起作用。

需要注意的一件事是,使用 strtok、strcpy 和 strcat 将行放入单独的变量中可以正常工作。我不认为这是造成这种情况的原因。

struct entrant {
int number;
char *name;
};


void read_in_entrants(char fileName[]) {
FILE *fr;
fr = fopen(fileName, "rt");

//Init.
struct entrant * entrant_array = (struct entrant*) malloc(sizeof (struct entrant));
int j, temp, k = 0;
int *number;
char line[80];
char name[80];
char surname[80];

while(1) {
//Read line in file.
fgets(line, 80, fr);

//If at end of file break from loop.
if (feof(fr)) break;

//Edit line to be stored in variables.
number = strtok(line, " ");
strcpy(name, strtok(NULL, " "));
strcpy(surname, strtok(NULL, " "));
strcat(name, " ");
strcat(name, surname);

//Add variables to struct array.
entrant_array[k].number = atoi(number);
entrant_array[k].name = name;
printf(" %d %s\n", entrant_array[k].number, entrant_array[k].name);

//Handle malloc array memory.
temp = realloc(entrant_array, (k + 2) * sizeof (struct entrant));
if (temp != NULL) {
entrant_array = temp;
} else {
free(entrant_array);
printf("Error in memory allocation!");
return 1;
}
//Increase k.
k++;
}

//Print struct values in array.
for (j = 0; j < 10; j++) {
printf(" %d %s", entrant_array[j].number, entrant_array[j].name);
}

//Shut down.
free(entrant_array);
fclose(fr);
}

无论如何,我已经为此苦苦挣扎了几个小时,但我就是无法解决它。我对 C 的了解非常有限,而且我不知道需要做什么来解决这个问题。

感谢您的帮助,非常感谢:)

最佳答案

entrant.name 是一个指针,您将其分配给同一个本地 char 数组。因此,所有指针都指向同一个变量,该变量仅包含您读取的最后一个内容。直到它超出范围,此时它将指向随机内存。

最快的修复方法是更换

entrant_array[k].name = name;

entrant_array[k].name = strdup(name);

但是您需要记住稍后释放该内存。

关于c - 添加到 malloc 数组的值将成为 malloc 数组中的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13770716/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com