1

Cでは、配列内のすべての値を指定された値にするために、指定されたポインターをリセットするにはどうすればよいですか?forループを使用するのが最適ですか、それとも配列内のすべての値を0に設定するために使用できる関数がありますか。

私のコードは現在次のようなものです:

int main()
{
     double *my_values = calloc(10, sizeof(double));
     do_something_with_values(my_values);

     free(my_values);
     my_values = calloc(10, sizeof(double));

     do_something_else_with_values(my_values);
     free(my_values);
}

これは(私には)ハッキーに見えますが、どうすればこのコードを改善できますか?

4

8 に答える 8

5

memsetは、配列をすべてゼロまたは任意の値に設定できます

于 2011-03-18T17:00:19.403 に答える
4

コードはハッキーなだけでなく、深刻で再現が難しいバグにつながる可能性があります。

を実行してfreeから新しいcalloc呼び出しを実行すると、同じメモリスペースが配列に割り当てられることが保証されません。これを実行する前にこの配列へのポインタがあり、後で使用しようとすると、これが問題になる可能性があります。

于 2011-03-18T17:01:04.843 に答える
1

あなたの例のように、これが本当に常に固定サイズの配列に関するものである場合は、すでに割り当てが間違っている可能性があります。やるほうがいい

int main(void) // <- this is the correct signature
{
     double my_values[10] = { 0 };
     do_something_with_values(my_values);

     memcpy(my_values, (const double[10]){0}, 10*sizeof(double));

     do_something_else_with_values(my_values);
}

ここでの定義と初期化により、0.0これを実行するアーキテクチャで配列が正しい値で初期化されます。での再初期化memcpyも同じです。これを実現するために複合リテラルを使用します。その部分にはC99準拠のコンパイラが必要です。

于 2011-03-18T17:43:09.043 に答える
0

初期化には、次の簡単な使用が可能です。

double myarray[100] = {0};
于 2011-03-18T17:42:30.490 に答える
0

昔々、1975年に、誰かがCと呼ばれるまったく新しいプログラミング言語のライブラリを書き始めました。64KBを超えるRAMがあれば、世界最大のスーパーコンピューターの1つにアクセスできました。

したがって、のようなルーチンmemset()が設計されたとき、8ビットバイトよりも大きいものを初期化する必要があるとは誰も想像できませんでした。当時、 1バイトは巨大でした。

もっと大きなものが必要な場合は、独自のループを作成する必要があります。プラス面では、すべてのバイトが0の場合、すべてのCタイプはゼロになります。したがってcalloc()、メモリを使用するか、別の場所からメモリを取得して、memset(ptr, 0, size);

于 2011-03-18T17:03:38.983 に答える
-1

最も簡単な方法はおそらく使用することですmemset

    memset( the_array, '\0', sizeof(the_array) );

これにより、アレイ全体がゼロになります

于 2011-03-18T17:00:43.030 に答える
-1

memsetを使用する:

memset(my_values, 0, 10 * sizeof(double));
于 2011-03-18T17:02:03.253 に答える
-1

私はここで完全にベースから外れているかもしれませんが:私はmemsetを使用します。

http://www.linuxmanpages.com/man3/memset.3.php

于 2011-03-18T17:03:02.237 に答える