专业阵列处理

时间:2013-03-09 16:08:17

标签: c arrays malloc

我是一位没有经验的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 ++”,我确信当我了解更多内容时,会有更好的(并且是最新的)参考文献。

2 个答案:

答案 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

    }

我知道这不是那么有效,但我希望它会对你有所帮助:)。