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でこれを行うための専門的な方法は何ですか?アレイを事前に割り当てたり、動的にサイズ変更したりしますか?

私は現在、ハーバート・シルトの「ターボ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 に答える