【问题标题】:Dynamic Array in a loop in C [closed]C中循环中的动态数组[关闭]
【发布时间】:2015-09-17 12:57:27
【问题描述】:

我想创建一个代码,该代码将根据用户需求存储新数组并对其执行特定的操作集。所以,考虑到一旦操作完成后我真的不需要存储该数组,我想覆盖同一个数组,但这就是我遇到问题的地方。

int main() 
{
    int i, T;

    scanf("%d", &T);
    int res[T];//for T cases I'll have T outputs so saving it in an array

    for(i=0; i<T; i++)
    {
        int size, j;
        scanf("%d", &size);
        int ary[size];
        for(j=0; j<size; j++)
        {
            scanf("%d ", &ary[j]);
        }
        //In each case I'm just declaring an array and getting a result n storing in another array
        res[i]=fn(ary, size);//fn returns 1 if array forms Circular Prime else 0
    }

    for(i=0; i<T; i++)
    {
        if(res[i]==1)
            printf("YES\n");
        else
            printf("NO\n");            
    }
    return 0;
}

【问题讨论】:

  • 你有什么问题?有什么问题,预期的结果是什么?请尽量让您的问题易于回答!
  • 你有什么问题?我不清楚问题是什么。请描述您希望它做什么以及它会做什么。
  • 您标记的动态分配在哪里?您面临的问题是什么?
  • @ameyCU 我想这就是他试图用int res[T]int ary[size] 做的事情。
  • scanf("%d ", &amp;ary[j]); 更改为 scanf("%d", &amp;ary[j]);

标签: c arrays memory dynamic-memory-allocation


【解决方案1】:

C89 不允许使用非常量绑定说明符创建数组。 C99 引入了这个概念,C11 将其作为可选功能。为了 100% 可移植,您应该使用动态内存分配来解决这个问题:

int main() {
    int i, T;
    scanf("%d", &T);
    //DYNAMIC MEMORY ALLOCATION
    int *res = malloc(T * sizeof(int)); //for T cases I'll have T outputs so saving it in an array
    if (res == NULL) { //Check for failure
        /* failure, out of memory */
        return 1;
    }
    for(i=0; i<T; i++){
        int size, j;
        scanf("%d", &size);
        //DYNAMIC MEMORY ALLOCATION
        int *ary = malloc(size * sizeof(int));
        if (ary == NULL) { //Check for failure
            /* failure, out of memory */
            return 1;
        }
        for(j=0; j<size; j++){
            scanf("%d", &ary[j]);
        } //In each case I'm just declaring an array and getting a result n storing in another array
        res[i]=fn(ary, size);//Called a function got a result stored in res[]
        //FREE ALLOCATED MEMORY
        free(ary);
    }
    for(i=0; i<T; i++){
        if(res[i]==1)
            printf("YES\n");
        else
            printf("NO\n");            
    }
    //FREE ALLOCATED MEMORY
    free(res);
    return 0;
}

【讨论】:

  • 在 1989 年 C 不接受非常量长度。时代变了。
  • C 自 C99 以来就有 VLA,因此除非 OP 使用的是古老的编译器,否则此答案不适用。
  • @ams - 更新响应。
猜你喜欢
  • 2021-01-11
  • 2013-12-17
  • 2018-03-07
  • 2020-10-06
  • 2016-05-28
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多