我一直在努力思考一个我确信是可能的想法,我只是不确定我是否以正确的方式去做。我的意图是创建一个数组,然后用用户想要的尽可能多的值填充它。然而,我的目标是不使用任何定义值本身。我希望能够继续增加它可以无限地包含的值的数量。
这是我一直在使用的测试代码,试图找出这个问题:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
int Up;
int Ary[0];
printf("Please enter the number of integers you want to input: ");
scanf("%d", &Up);
for(i = 0; i < Up; i++)
{
printf("Please enter a number: ");
Ary[i] = (int) malloc(sizeof(int));
scanf("%d", &Ary[i]);
}
for(i = 0; i < Up; i++)
{
printf("%d ", Ary[i]);
if(i % 10 == 0)
{
printf("n");
}
}
return 0;
}
这可能是一个糟糕的方式来试图弄清楚,我也可能这样做是一个完全错误的方式;然而,我有时会遇到分割错误。如果我使用小的值,比如只输入4或5个值,它工作得很好,但是如果我输入10个值,它会给我一个分割错误。如果我输入50个值,它允许我输入所有50个值,但在打印出第41个值后给我一个分段错误。
代码本身只是达到目的的一种手段。最终,我想知道的是如何建立一个数组的任何东西,可以有值添加到它无限期,同时保留以前的值使用动态内存分配?
p。我希望这能很好地定义我的问题,但是如果没有,我想完善我的问题,这样就更清楚了。
这行不通:
int Ary[0];
你创建了一个没有元素的数组;这种数组的唯一有效用途是获取它的地址,但你不能像以前那样对它进行索引。
相反,您应该创建一个指针,指向稍后将作为数组分配的对象:int *Ary;
当你知道你想要多少个整数时:
Ary = malloc(Up * sizeof(int));
现在您可以对从0到(Up-1)的任何索引执行Ary[index]
。如果您以后想要扩大数组,您可以使用realloc()
(许多在线教程)。
您需要使用动态分配,您现在所做的是静态分配,您需要学习如何使用malloc
和free
。
所以请记住,你想要做的不是"高效",但绝对可以作为一个学习练习来学习如何制作这样一个容器。
你需要做的是分配所需的内存量,以包含当前数组中的值的数量+每次你想"添加"一个新值到你的数组,例如:malloc(sizeof(int)*(<current_number_of_values>+1))
。
我说"添加"在引号中,因为你将不得不做的是每次为一个全新的数组分配内存,并复制你的旧值加上用户输入的新值,然后free
你的旧数组,以避免内存泄漏。
有一些STL容器可以在内部做到这一点,但效率要高得多,但我认为你这样做是为了学习,而不是在任何严肃的事情上使用你自己的容器。