【发布时间】:2010-12-08 04:46:07
【问题描述】:
C 新手,非常感谢您的帮助。
是否可以在 C 中定义一个数组而不指定其大小或初始化它。
例如,我可以提示用户输入数字并将它们存储在 int 数组中吗?我不知道他们会预先输入多少个数字。
我现在能想到的唯一方法就是定义一个最大尺寸,这不是一个理想的解决方案......
【问题讨论】:
标签: c malloc dynamic-memory-allocation
C 新手,非常感谢您的帮助。
是否可以在 C 中定义一个数组而不指定其大小或初始化它。
例如,我可以提示用户输入数字并将它们存储在 int 数组中吗?我不知道他们会预先输入多少个数字。
我现在能想到的唯一方法就是定义一个最大尺寸,这不是一个理想的解决方案......
【问题讨论】:
标签: c malloc dynamic-memory-allocation
嗯,你可以动态分配大小:
#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;
}
【讨论】:
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);
}
}
这将提示输入数字并将它们存储在一个数组中,如您所要求的。给定 0 时,它将终止。
您创建了一个访问器函数array_push 用于添加到您的数组中,当您用完空间时,您可以使用此函数调用realloc。每次都将分配的空间量加倍。最多你会分配双倍你需要的内存,最坏的情况你会调用realloc log n 次,其中 n 是最终预期的数组大小。
您可能还想在调用 malloc 和 realloc 后检查失败。我没有在上面这样做。
【讨论】:
根据定义,数组是固定大小的内存结构。你想要一个向量。由于标准 C 没有定义向量,您可以尝试寻找一个库,或者自己动手制作。
您需要进行动态分配:您需要一个指向未知大小的内存地址的指针。阅读malloc 和realloc。
【讨论】:
realloc 调用的数量,而是为了保持良好的渐近效率。如果在每次重新分配时向向量添加一个恒定增量,则推入 n 元素需要 O(n^2) 时间。如果在重新分配时将大小乘以 >1 的某个因子,则每次推送都需要摊销的常数时间,整个过程需要 O(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;
}
【讨论】:
您可以使用malloc 动态分配内存(即直到运行时才知道大小)。
C 是一种低级语言:使用后必须手动释放内存;否则,您的程序将遭受内存泄漏。
只需阅读您对另一个答案的评论。
您需要一个大小动态变化的数组。
嗯,C 没有语言/句法工具可以做到这一点;您要么必须自己实现它,要么使用已经实现它的库。
看到这个问题:Is there an auto-resizing array/dynamic array implementation for C that comes with glibc?
【讨论】:
对于这样的事情,您可能需要研究以下数据结构: 链接列表(适合这种情况) 各种树(二叉树、堆等) 堆栈和队列
但至于实例化一个可变大小的数组,这是不可能的。
最接近动态数组的是使用 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;
}
但请记住,这是一个非标准扩展,因此如果可移植性很重要,您不应该指望它。
【讨论】:
上面给出的答案是正确的,但有一个更正,函数 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);
}
【讨论】: