Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你能用C语言定义运行时数组的大小吗_C_Malloc_Dynamic Memory Allocation - Fatal编程技术网

你能用C语言定义运行时数组的大小吗

你能用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

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;
}
#包括
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);
    }