【问题标题】:Array with No Upper Boundaries in CC中没有上边界的数组
【发布时间】:2015-10-04 03:42:08
【问题描述】:

我一直在试图围绕一个我确信是可能的想法,我只是不确定我是否以正确的方式进行。我的目的是创建一个数组,然后用用户想要的任意数量的值填充它。但是,我的目标是不使用任何定义的值本身。我希望能够继续无限地增加它可以包含的值的数量。

这是我一直用来尝试解决这个问题的测试代码:

#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。我希望这足以很好地定义我的问题,但是如果没有,我想完善我的问题,以便更清楚。如果不清楚以及原因,请发表评论。

【问题讨论】:

    标签: c arrays malloc dynamic-memory-allocation


    【解决方案1】:

    这是行不通的:

    int Ary[0];
    

    你已经创建了一个没有元素的数组;这种数组的唯一有效用途是获取它的地址,但你不能像以前那样索引它。

    相反,您应该创建一个指向稍后将作为数组分配的指针:

    int *Ary;
    

    那么当你知道你想要多少个整数时:

    Ary = malloc(Up * sizeof(int));
    

    现在您可以对从 0 到 (Up-1) 的任何索引执行 Ary[index]。如果以后想放大数组,可以使用realloc()(网上有很多教程)。

    【讨论】:

    • 如果假设我要添加 12 个整数,然后稍后在程序中返回并决定要添加 13,我该怎么做?但是我没有指定 13 开始,因为我当时只需要 12。
    • 老实说,我在过去的几个小时里一直在搜索,也许我搜索这个的方式是错误的,但我没有快速找到所需的信息。
    • @Arrowkill:既然您知道您需要使用realloc(),您应该能够弄清楚。如果您遇到困难,请提出关于 realloc() 的新问题。
    • int Ary[0]; 不仅“不能工作”,而且也不能编译! ISO 9899:2011 §6.7.6.3 Array declarators ¶1(强调我的):“[...] [] 可以分隔表达式 [...] 表达式应有一个整数类型。 [...] 它的值应大于零。 [...]”
    • @FUZxxl:仅仅因为 C 标准不允许零长度数组并不意味着它们不会编译。事实上,GCC 明确允许它们作为(有时有用,但不是在 OP 的上下文中)扩展:gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
    【解决方案2】:

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

    所以请记住,您想要做的并不是“高效”,但绝对可以作为学习练习来完成,以学习如何制作这样的容器。

    您需要做的是分配包含当前在数组中的值数量所需的内存量 + 每次您想向数组“添加”新值时再增加 1 个值,例如:malloc(sizeof(int)*(&lt;current_number_of_values&gt;+1)) .

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

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

    【讨论】:

    • 你是对的,确切地说,我正在测试这个,然后我撕开一些已经编写的代码并将其重新设计为我的班级的新规范。
    猜你喜欢
    • 2013-10-20
    • 2012-11-13
    • 2013-06-22
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2014-11-08
    • 1970-01-01
    相关资源
    最近更新 更多