1

我是一个没有经验的 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++”,我确信当我深入研究时会有更好的(和最新的)参考。

4

2 回答 2

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? */
}
于 2013-03-09T18:14:54.330 回答
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

    }

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

于 2013-03-09T17:21:10.007 回答