您可以在C中定义运行时数组的大小

时间:2009-10-20 01:20:49

标签: c

C的新手,非常感谢你的帮助。

是否可以在C中定义数组而无需指定其大小或初始化它。

例如,我可以提示用户输入数字并将它们存储在int数组中吗?我不知道他们预先输入了多少数字。

我现在能想到的唯一方法是定义最大尺寸,这不是一个理想的解决方案......

10 个答案:

答案 0 :(得分:11)

好吧,你可以动态分配大小:

#include <stdio.h>

int main(int argc, char *argv[])
{
  int *array;
  int cnt;
  int i;

  /* In the real world, you should do a lot more error checking than this */
  printf("enter the amount\n");
  scanf("%d", &cnt);

  array = malloc(cnt * sizeof(int));

  /* do stuff with it */
  for(i=0; i < cnt; i++)
    array[i] = 10*i;

  for(i=0; i < cnt; i++)
    printf("array[%d] = %d\n", i, array[i]);

  free(array);

  return 0;
}

答案 1 :(得分:6)

也许是这样的:

#include <stdio.h>
#include <stdlib.h>

/* An arbitrary starting size. 
   Should be close to what you expect to use, but not really that important */
#define INIT_ARRAY_SIZE 8

int array_size = INIT_ARRAY_SIZE;
int array_index = 0;
array = malloc(array_size * sizeof(int));

void array_push(int value) {
  array[array_index] = value;
  array_index++;
  if(array_index >= array_size) {
    array_size *= 2;
    array = realloc(array, array_size * sizeof(int));
  }
}

int main(int argc, char *argv[]) {
  int shouldBreak = 0;
  int val;
  while (!shouldBreak) {
    scanf("%d", &val);
    shouldBreak = (val == 0);
    array_push(val);
  }
}

这将提示您输入数字并将其存储在数组中,如您所知。在给定0时传递将终止。

您创建了一个访问者函数array_push以便添加到您的数组,当您用完空间时,可以使用此函数调用realloc。每次分配的空间量增加一倍。最多你会分配你需要的双倍内存,最坏的情况下你会调用realloc log n次,其中n是最终的数组大小。

您可能还想在调用malloc和realloc后检查是否有失败。我上面没有这样做。

答案 2 :(得分:3)

根据定义,数组是固定大小的内存结构。你想要一个矢量。由于标准C没有定义向量,您可以尝试查找库,或者手动滚动自己的库。

您需要进行动态分配:您需要一个指向尚未知大小的内存地址的指针。阅读mallocrealloc

答案 3 :(得分:2)

如果您只需要一个数据结构,您可以在其中动态更改其大小,那么您可以选择的最佳选项是链接列表。您可以向列表中添加数据,为其动态分配内存,这样会更容易!!

答案 4 :(得分:1)

是的,绝对的。 C99引入了VLA或可变长度阵列。 一些简单的代码就是这样的:

#include <stdio.h>

int main (void) {

    int arraysize;
    printf("How bid do you want your array to be?\n");
    scanf("%d",&arraysize);
    int ar[arraysize];  
    return 0;
}

答案 5 :(得分:0)

您可以使用malloc动态分配内存(即直到运行时才知道大小)。

C是一种低级语言:你必须在使用后手动释放内存;如果你不这样做,你的程序将遭受内存泄漏。

更新

请阅读您对其他答案的评论。

您要求的是一个动态变化大小的数组。

嗯,C没有语言/句法设施可以做到这一点;你要么自己实现它,要么使用已经实现它的库。

请参阅此问题:Is there an auto-resizing array/dynamic array implementation for C that comes with glibc?

答案 6 :(得分:0)

对于类似的内容,您可能希望查看数据结构,例如: 链接列表(适合这种情况) 各种树木(二叉树,堆等) Stacks&amp;队列

但至于实例化一个可变大小的数组,这实际上是不可能的。

最接近动态数组是使用malloc及其相关命令(delete,realloc等)。

但是在这种情况下,使用像malloc这样的命令可能会导致需要扩展数组,这是一个昂贵的操作,您初始化另一个数组,然后将旧数组复制到该数组中。列表和其他数据类型通常在调整大小方面要好得多。

答案 7 :(得分:0)

如果您正在寻找阵列设施并且不想自己动手,请尝试以下方法:

  1. Glib
  2. Apache APR
  3. NSPR

答案 8 :(得分:0)

如果您是初学者,也许您不想处理mallocfree。因此,如果您正在使用GCC,则可以在堆栈上分配可变大小的数组,只需将大小指定为表达式。

例如:

#include <stdio.h>
void dyn_array(const unsigned int n) {
        int array[n];
        int i;

        for(i=0; i<n;i++) {
                array[i]=i*i;
        }
        for(i=0; i<n;i++) {
                printf("%d\n",array[i]);
        }
}
int main(int argc, char **argv) {
        dyn_array(argc);
        return 0;
}

但请记住,这是一个非标准扩展,所以如果可移植性很重要,你就不应指望它。

答案 9 :(得分:0)

上面给出的答案是正确的但是有一个更正,函数malloc()保留一个指定大小的内存块并返回一个void *类型的指针,它可以被转换为任何形式的指针。 语法:ptr =(cast-type *)malloc(byte-size)

#include<stdio.h>
#include<cstdlib>
int main(int argc,char* argv[]){
int *arraySize,length;
scanf("%d",&length);
arraySize = (int*)malloc(length*sizeof(int));
for(int i=0;i<length;i++)
    arraySize[i] = i*2;
for(int i=0;i<length;i++)
    printf("arrayAt[%d]=%d\n",i,arraySize[i]);
free(arraySize);
}