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()(网上有很多教程)。

你需要使用动态分配,你现在做的是静态分配,你需要学习如何使用mallocfree

所以请记住,您想要做的不是 "efficient" 但绝对可以作为学习练习来学习如何制作这样的容器。

您需要做的是分配包含数组中当前值的数量所需的内存量 +1 每次您想要 "add" 一个新值到您的数组时的值,例如:malloc(sizeof(int)*(<current_number_of_values>+1))

我在引号中说 "add" 是因为您实际上每次都需要为一个全新的数组分配内存,然后复制您的旧值加上用户输入的新值,然后 free 你的旧数组以避免内存泄漏。

有一些 STL 容器可以在内部执行此操作,但效率要高得多,但我假设您这样做是为了学习,而不是将自己的容器用于任何严肃的事情。