你能用C语言定义运行时数组的大小吗
C新手,非常感谢你的帮助 是否可以在C中定义一个数组,而无需指定其大小或初始化它 例如,我可以提示用户输入数字并将其存储在int数组中吗?我不知道他们会事先输入多少数字你能用C语言定义运行时数组的大小吗,c,malloc,dynamic-memory-allocation,C,Malloc,Dynamic Memory Allocation,C新手,非常感谢你的帮助 是否可以在C中定义一个数组,而无需指定其大小或初始化它 例如,我可以提示用户输入数字并将其存储在int数组中吗?我不知道他们会事先输入多少数字 我现在能想到的唯一方法是定义一个最大大小,这不是一个理想的解决方案…好的,您可以动态分配大小: #include <stdio.h> int main(int argc, char *argv[]) { int *array; int cnt; int i; /* In the real worl
我现在能想到的唯一方法是定义一个最大大小,这不是一个理想的解决方案…好的,您可以动态分配大小:
#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;
}
#包括
int main(int argc,char*argv[])
{
int*数组;
int-cnt;
int i;
/*在现实世界中,您应该做更多的错误检查*/
printf(“输入金额”);
scanf(“%d”和&cnt);
数组=malloc(cnt*sizeof(int));
/*用它做点什么*/
对于(i=0;i
根据定义,数组是固定大小的内存结构。你需要一个向量。由于标准C没有定义向量,您可以尝试寻找一个库,或者手动滚动自己的库
您需要进行动态分配:您需要一个指向未知大小的内存地址的指针。请阅读
malloc
和realloc
可能类似以下内容:
#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);
}
}
#包括
#包括
/*任意起始大小。
应该接近您期望使用的内容,但实际上没有那么重要*/
#定义初始数组大小8
int数组大小=INIT数组大小;
int数组_索引=0;
数组=malloc(数组大小*sizeof(int));
无效数组_push(int值){
数组[数组索引]=值;
数组_index++;
如果(数组索引>=数组大小){
数组大小*=2;
array=realloc(数组,数组大小*sizeof(int));
}
}
int main(int argc,char*argv[]){
int shouldBreak=0;
int-val;
而(!shouldBreak){
scanf(“%d”和&val);
shouldBreak=(val==0);
阵列推送(val);
}
}
这将提示输入数字,并按照您的要求将其存储在数组中。当传递给0时,它将终止
您创建了一个访问器函数array\u push
以添加到您的数组中,当空间用完时,您可以使用此函数调用realloc
。每次分配的空间量增加一倍。最多您将分配两倍所需的内存,最坏情况下您将调用realloc
log n次,其中is n是最终的预期数组大小
在调用malloc和realloc之后,您可能还需要检查失败。上面我没有这样做。您可以使用
malloc
动态分配内存(即直到运行时才知道内存大小)
C是一种低级语言:你必须在使用后手动释放内存;如果不这样做,您的程序将遭受内存泄漏
更新
看看你对另一个答案的评论
您需要一个大小动态变化的数组
好吧,C没有语言/语法工具来做这件事;您要么自己实现,要么使用已经实现的库
请参阅此问题:对于类似的问题,您可能希望查看以下数据结构: 链表(非常适合这种情况) 各种树(二叉树、堆等) 堆栈和队列 但对于实例化一个可变大小的数组,这实际上是不可能的 最接近动态数组的方法是使用malloc及其相关命令(delete、realloc等)
但是在这种情况下,使用诸如malloc之类的命令可能会导致需要扩展阵列,这是一个昂贵的操作,您需要初始化另一个阵列,然后将旧阵列复制到该阵列中。列表和其他数据类型通常更擅长调整大小 如果您正在寻找阵列设施,但不想自己使用,请尝试以下操作:
如果您所需要的只是一个数据结构,在这个结构中,您可以动态地更改其大小,那么您可以选择的最佳选项就是链表。您可以将数据添加到列表中,为其动态分配内存,这将更容易 如果您是初学者,可能还不想处理
malloc
和free
。因此,如果使用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;
}
#包括
void dyn_数组(常量无符号整数){
整数数组[n];
int i;
对于(i=0;i是的,绝对是)。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;
}
#包括
内部主(空){
内部阵列化;
printf(“您希望阵列的出价是多少?\n”);
scanf(“%d”,阵列化(&A);
int-ar[arraysize];
返回0;
}
以上给出的答案是正确的,但有一个更正,即函数malloc()保留指定大小的内存块,并返回void*类型的指针,该指针可以转换为任何形式的指针。
语法:ptr=(强制类型*)malloc(字节大小)
#包括
#包括
int main(int argc,char*argv[]){
int*数组化,长度;
扫描频率(“%d”和长度);
arraySize=(int*)malloc(length*sizeof(int));
对于(int i=0;iGranted,你需要知道每次跑步时要添加多少个数字。realloc
否则。谢谢你的帮助。我想我在第一篇文章中没有明确问过这个问题。问题是我们不知道用户将输入多少数字,用户也不知道。假设我们要求用户输入任意数量的数字,然后我们为他计算平均值。他所需要做的是键入数字,键入输入,键入另一个数字……当他完成时,键入这些数字,而不要求用户告诉我他计划键入多少个数字。这将是一个简单的向量用法在C++中…抱歉,平均是一个坏例子,因为我们所需要的是总和,让我们说。我们需要保存所有的数字来做一些奇特的计算…@Bobby-说到拼写错误,“动态”哈
#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);
}