我需要读取整数列表并将它们存储在数组中。整数的数量是未知的,因此如果数组变满并且有更多的整数要读入,则需要调整数组的大小。它们只会被读入一次,当用户输入某个值以终止循环时,程序将知道用户已完成输入。
无论如何,我意识到我将使用 malloc() 和 realloc(),但有点困惑。我们将使用 scanf() 来读取值。
假设我最初创建大小为 10 的数组。我想我会在循环中使用 if/else 语句来确定何时使用 realloc,但我不确定如何检查这一点。
int value;
int index;
int* myArray;
// Allocate space for array of 10 ints to start
myArray = malloc(sizeof(int)*SIZE);
index = 0;
// Prompt
printf("Please enter as many integers as you would like.n");
printf("Enter the integer '123' to indicate when you are finished.nn");
scanf("%d", &value);
while (value != 123) {
scanf("%d", &value);
myArray[index] = value;
index++;
}
我认为这正确地读取整数并将它们存储在 myArray 中。现在,当它达到第 10 个整数时,每次达到极限时,我都会想将数组大小加倍,依此类推,对吗?
首先,你忽略了第一个整数。循环体应该在等待下一个整数之前写入数组,如下所示:
scanf("%d", &value);
while (value != 123) {
myArray[index] = value;
index++;
scanf("%d", &value);
}
现在,您需要保留一个变量来保存当前数组的大小。然后,在写入数组之前,如果索引等于当前数组的大小,则需要重新分配:
arr_sz = SIZE;
scanf("%d", &value);
while (value != 123) {
if (index == arr_sz) {
arr_sz *= 2;
myArray = realloc(myArray, sizeof(*myArray)*arr_sz);
}
myArray[index] = value;
index++;
scanf("%d", &value);
}
您可能需要测试并确保malloc()
和realloc()
不会返回NULL
。
最后,我建议您更改第一个分配:
myArray = malloc(sizeof(int)*SIZE);
到稍微更易于维护的形式:
myArray = malloc(sizeof(*myArray)*SIZE);
这样,即使myArray
类型发生变化,也无需更新此行代码。