刚学习C语言,非常感谢您的帮助。
在C语言中是否可以定义一个数组而不指定其大小或初始化它。
例如,我能否提示用户输入数字并将它们存储在int数组中? 我事先不知道他们会输入多少数字。
目前我所能想到的唯一方法是定义一个最大大小,但这不是理想的解决方案...
刚学习C语言,非常感谢您的帮助。
在C语言中是否可以定义一个数组而不指定其大小或初始化它。
例如,我能否提示用户输入数字并将它们存储在int数组中? 我事先不知道他们会输入多少数字。
目前我所能想到的唯一方法是定义一个最大大小,但这不是理想的解决方案...
你可以动态分配大小:
#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;
}
也许是这样:
#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);
}
}
array_push
来添加到数组中,在该函数中调用realloc
以释放空间。每次分配的空间量增加一倍。最多会分配比所需内存多一倍的内存,最坏情况下,您将调用realloc
log n次,其中n是最终预期的数组大小。是的,完全正确。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;
}
按照定义,数组是固定大小的内存结构。您需要一个向量。由于标准C没有定义向量,您可以尝试查找库或手动实现。
您需要进行动态分配:您需要一个指向尚未知大小的内存地址的指针。请阅读有关 malloc
和 realloc
的内容。
realloc
调用的数量,而是为了保持良好的渐进效率。如果在每次重新分配时向向量添加一个常数增量,则推入n个元素需要O(n^2)的时间。如果在每次重新分配时将大小乘以某个因子>1,则每次推送都需要平摊的常数时间,并且整个过程需要O(n)的时间。 - Phil Miller#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;
}
但请记住,这是一个非标准扩展,因此如果可移植性很重要,您不应该依赖它。
#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);
}
你可以使用 malloc
动态地分配内存(也就是直到运行时才知道大小)。
C语言是一种底层语言:在使用完内存后必须手动释放;否则,你的程序将受到内存泄漏的影响。
刚刚看到了你在另一个答案中的评论。
你正在寻求一个具有动态变化大小的数组。
然而,C语言没有语言/语法工具来实现这一点;你要么必须自己实现它,要么使用已经实现它的库。
对于这种情况,您可能需要研究数据结构,例如:
但是,对于实例化变量大小的数组,这并不是真正可能的。
最接近动态数组的方法是使用malloc及其相关命令(delete、realloc等)。
但在这种情况下,使用类似malloc的命令可能会导致需要扩展数组,这是一项昂贵的操作,需要初始化另一个数组,然后将旧数组复制到其中。列表和其他数据类型通常更擅长调整大小。
realloc
。 - Tordek