C 中没有上边界的数组
Array with No Upper Boundaries in C
我一直在努力思考一个我确信是可能的想法,我只是不确定我是否以正确的方式去做。我的意图是创建一个数组,然后用用户想要的任意多的值填充它。但是我的目标是不使用任何定义的值本身。我希望能够继续增加它可以无限期包含的值的数量。
这是我一直用来尝试解决这个问题的测试代码:
#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 个值后给我一个分段错误。
代码本身只是达到目的的一种手段。最终我想知道的是如何设置一个数组,其中包含可以无限期添加值的任何东西,同时使用动态内存分配保留以前的值?
PS。我希望这足以很好地定义我的问题,但是如果没有,我想完善我的问题,以便更清楚。如果不清楚并说明原因,请发表评论。
这行不通:
int Ary[0];
您创建了一个没有任何元素的数组;此类数组的唯一有效用途是获取其地址,但您不能像您那样对其进行索引。
相反,您应该指向稍后将分配为数组的内容:
int *Ary;
然后当你知道你想要多少个整数时:
Ary = malloc(Up * sizeof(int));
现在您可以对从 0 到 (Up-1) 的任何索引执行 Ary[index]
。如果以后想扩大数组,可以使用realloc()
(网上有很多教程)。
你需要使用动态分配,你现在做的是静态分配,你需要学习如何使用malloc
和free
。
所以请记住,您想要做的不是 "efficient" 但绝对可以作为学习练习来学习如何制作这样的容器。
您需要做的是分配包含数组中当前值的数量所需的内存量 +1 每次您想要 "add" 一个新值到您的数组时的值,例如:malloc(sizeof(int)*(<current_number_of_values>+1))
。
我在引号中说 "add" 是因为您实际上每次都需要为一个全新的数组分配内存,然后复制您的旧值加上用户输入的新值,然后 free
你的旧数组以避免内存泄漏。
有一些 STL 容器可以在内部执行此操作,但效率要高得多,但我假设您这样做是为了学习,而不是将自己的容器用于任何严肃的事情。
我一直在努力思考一个我确信是可能的想法,我只是不确定我是否以正确的方式去做。我的意图是创建一个数组,然后用用户想要的任意多的值填充它。但是我的目标是不使用任何定义的值本身。我希望能够继续增加它可以无限期包含的值的数量。
这是我一直用来尝试解决这个问题的测试代码:
#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 个值后给我一个分段错误。
代码本身只是达到目的的一种手段。最终我想知道的是如何设置一个数组,其中包含可以无限期添加值的任何东西,同时使用动态内存分配保留以前的值?
PS。我希望这足以很好地定义我的问题,但是如果没有,我想完善我的问题,以便更清楚。如果不清楚并说明原因,请发表评论。
这行不通:
int Ary[0];
您创建了一个没有任何元素的数组;此类数组的唯一有效用途是获取其地址,但您不能像您那样对其进行索引。
相反,您应该指向稍后将分配为数组的内容:
int *Ary;
然后当你知道你想要多少个整数时:
Ary = malloc(Up * sizeof(int));
现在您可以对从 0 到 (Up-1) 的任何索引执行 Ary[index]
。如果以后想扩大数组,可以使用realloc()
(网上有很多教程)。
你需要使用动态分配,你现在做的是静态分配,你需要学习如何使用malloc
和free
。
所以请记住,您想要做的不是 "efficient" 但绝对可以作为学习练习来学习如何制作这样的容器。
您需要做的是分配包含数组中当前值的数量所需的内存量 +1 每次您想要 "add" 一个新值到您的数组时的值,例如:malloc(sizeof(int)*(<current_number_of_values>+1))
。
我在引号中说 "add" 是因为您实际上每次都需要为一个全新的数组分配内存,然后复制您的旧值加上用户输入的新值,然后 free
你的旧数组以避免内存泄漏。
有一些 STL 容器可以在内部执行此操作,但效率要高得多,但我假设您这样做是为了学习,而不是将自己的容器用于任何严肃的事情。