我是一位没有经验的C程序员:我希望5000以下的所有数字都是5的倍数。以下是我目前的工作方式:
int main()
{
int i;
const int max =5000-1;
for(i=2; i<(max+1); i++)
{
if(!(i%5))
{
printf("%d\n", i);
}
}
return 0;
}
假设我希望它们全部列在数组中。我能做的只是预先分配一个整数数组并填写各种位置。当然我不能事先知道确切的所需长度,所以我会估计它的长度。
但是,我来自C ++背景,所以通常我要做的就是推倒一个矢量,一切都干净整洁。但是在C中这样做的专业方法是什么?你们会预先分配或动态调整阵列的大小吗?
我目前正在使用Herbert Schildt的“Turbo C / C ++”,我确信当我了解更多内容时,会有更好的(并且是最新的)参考文献。
答案 0 :(得分:1)
realloc
会做你正在谈论的一切。分配数组,增长数组,缩小数组:它完成所有工作。
int max = 5000; /* why subtract one if you have to add one to use it? */
int *arr = NULL;
int i;
arr = realloc(arr, max * sizeof *arr); /* allocate generous array */
for (i = 0; i < max; i++) {
/* ... */
}
max = 10000;
arr = realloc(arr, max * sizeof *arr); /* grow array */
max = 100;
arr = realloc(arr, max * sizeof *arr); /* shrink array */
现在有一些流行的建议,你应该始终将realloc
的返回值保存为一个单独的变量,并在覆盖真正的指针变量之前检查它是否为NULL。这是因为有一些奇怪的情况,realloc可能会失败,即使是像缩小数组一样无害的事情。如果malloc子系统是使用固定大小的桶实现的,则会发生这种情况。如果没有任何“小”区域可用,则缩小的请求可能会因固定大小的存储桶系统而失败。
如果realloc
失败,则返回NULL,但原始分配保持不变。如果只是将返回值写入指针变量,那么该数据将丢失。所以,一般来说,你应该尝试这样做:
int *tmp;
tmp = realloc(arr, max * sizeof *arr);
if (tmp) {
arr = tmp;
} else {
/* maybe issue an error message? */
}
答案 1 :(得分:0)
如果您想分配完美尺寸,可以试试这个:
#include <stdio.h>
#include <stdlib.h>
int main(){
int i, j;
int max = 5000;
int * ourNumbers = 0;
int count = 0;
for(i = 2; i < max; i++){
if (i % 5 == 0){
count += 1;
}
}
printf("\ncount = %d\n", count);
ourNumbers = (int *) malloc(sizeof (int) * count);
// and after you can populate your array with those values;
// like this you will allocate the exact memory
}
我知道这不是那么有效,但我希望它会对你有所帮助:)。