10

2 次元配列を整数で初期化しようとしています。配列を 0 に初期化すると正しい結果が得られますが、他の整数を使用するとランダムな値が得られます。

int main()
{
    int array[4][4];
    memset(array,1,sizeof(int)*16);
    printf("%d",array[1][2]); <---- Not set to 1
}
4

4 に答える 4

15

memset配列のすべてのバイトを1すべてのint要素ではなく設定します。

すべての値を 1 に設定した初期化子リストを使用するか、ループ ステートメントを使用して値1をすべての要素にコピーします。

于 2013-02-07T21:09:58.720 に答える
6

memsetバイト単位でのみ機能します。すべての整数ゼロは一般にすべてゼロのビットであるため、ビットをゼロにすることは一般的に機能します。そのため、4 つのすべてがゼロのビット バイトを 1 つのすべてがゼロのビットにグループ化してintもゼロになります。ただし、バイトではないものの場合、すべてを初期化する最も簡単な方法は、すべてを明示的に初期化することです。

于 2013-02-07T21:11:29.573 に答える
5

memset個々のバイトをメモリとして埋めることができ、整数値 (おそらく 4 バイト以上) を設定しようとしています。アプローチは数値に対してのみ機能し、0これら-1は両方ともバイナリで00000000またはとして表され11111111ます。

for ループはそれほど面倒ではありません。

int main() {
    int i, val = 1, max = 4;
    int array[max][max];

    max = max * max;

    for(i = 0 i < max; i++) {
       array[i] = val;
    }
}
于 2013-02-07T21:25:59.733 に答える
1

memsetはバイトで動作し、すべてのバイトを 1 に設定するためです。

memset(hash, 1, cnt);

16843009 = 0x01010101 = 1000000010000000100000001
Not 0x00000001
ただし、ブール値またはバイナリ値のみが必要な場合は、C ライブラリの C99 標準を使用して設定できます

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>        //Use C99 standard for C language which supports bool variables

int main()
{
    int i, cnt = 5;
    bool *hash = NULL;
    hash = malloc(cnt);

    memset(hash, 1, cnt);
    printf("Hello, World!\n");

    for(i=0; i<cnt; i++)
        printf("%d ", hash[i]);

    return 0;
}

出力:

こんにちは世界!
1 1 1 1 1

于 2018-09-23T06:21:10.423 に答える