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

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

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

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

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

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

#include  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; } 

也许是这样的:

 #include  #include  /* 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后检查是否有失败。 我上面没有这样做过。

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

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

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

是的,一点没错。 C99引入了VLA或可变长度arrays。 一些简单的代码就是这样的:

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

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

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

UPDATE

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

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

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

看到这个问题: glibc附带的C是否有自动resize的数组/动态数组实现?

对于类似这样的事情,您可能希望查看数据结构,例如:链接列表(适合这种情况)各种树(二叉树,堆等)堆栈和队列

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

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

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

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

  1. 油嘴
  2. Apache APR
  3. NSPR

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

例如:

 #include  void dyn_array(const unsigned int n) { int array[n]; int i; for(i=0; i 

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

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

 #include #include int main(int argc,char* argv[]){ int *arraySize,length; scanf("%d",&length); arraySize = (int*)malloc(length*sizeof(int)); for(int i=0;i