cで整数配列にmemsetを使用する

char str[]="beautiful earth";
memset(str,'*',6);
printf("%s",str);

output:
******ful earth
  1. 上記のmemsetの使い方と同様に、以下のようにいくつかの整数配列のインデックス値だけを1に初期化することは可能でしょうか?
int arr[15];
memset(arr,1,6);
質問へのコメント (5)
ソリューション

いいえ、このように memset() を使用することはできません。manpage][1]にはこう書かれています(強調):

memset() 関数は、s が指すメモリ領域の最初の n bytes を定数バイト c で埋めます。

int`は通常4バイトなので、これでは間に合いません。


もし、あなたが(※不正解!※)これをやろうとしたら:

int arr[15];
memset(arr, 1, 6*sizeof(int));    //wrong!

とすると、配列の最初の6つの int は、実際には 0x010101 = 16843009 に設定されることになります。

非バイトデータ型のデータの塊を書き込むことができるのは、memset(thing, 0, sizeof(thing)); を使って文字列/配列全体をゼロにするときだけです。NULL、0x00000000、0.0はすべて完全に0であるため、これは有効です。


解決策は、forループを使い、自分で設定することです:


int arr[15];
int i;

for (i=0; i
解説 (11)

短い答え、NOです。

長い答えですが、memsetはバイトをセットし、文字はシングルバイトなので動作しますが、整数はそうではありません。

解説 (1)

memsetの第3引数はバイトサイズです。つまり、arr[15]の総バイトサイズを設定する必要があります。

memset(arr, 1, sizeof(arr));

しかし、おそらくはarrの全要素に値1を設定したいはずです。その場合は、ループの中で設定したほうがよいでしょう。

for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
    arr[i] = 1;
}

memset()`は各バイトに1をセットするからです。ということで、期待はずれでした。

解説 (6)

Linux、OSX、および「wchar_t」が32ビットで、「memset()」の代わりに「wmemset()」を使用できる他のUNIXのようなオペレーティングシステム。

#include
...
int arr[15];
wmemset( arr, 1, 6 );

MS-Windowsの wchar_tは16ビットであるため、このトリックが機能しない可能性があることに注意してください。

解説 (0)

いいえ、目的の目標値が「0」でない限り、その目的で「memset」を使用することはできません。 memsetは、ターゲットメモリ領域を intの配列ではなく、バイトの配列として扱います。

繰り返しパターンでメモリ領域を埋めるためのかなり人気のあるハックは、実際には「memcpy」に基づいています。 「memcpy」がデータを順方向にコピーするという期待に大きく依存しています。

int arr[15];

arr[0] = 1;
memcpy(&arr[1], &arr[0], sizeof arr - sizeof *arr);

もちろん、これはかなり醜いハックです。ソースと宛先のメモリ領域が重複する場合、標準の「memcpy」の動作は未定義です。 独自のバージョンの「memcpy」を作成して、データが順方向にコピーされていることを確認し、上記の方法で使用できます。 しかし、それは本当に価値がありません。 単純なサイクルを使用して、配列の要素を目的の値に設定します。

解説 (0)

理想的には、memsetを使用して配列をすべて1に設定することはできません。< br /> memset はバイトで動作し、すべてのバイトを1に設定するためです。< br />。

memset(hash, 1, cnt);

したがって、一度読むと、 16843009 = 0x010101 = 10000001000000100000100000001 < br />と表示されます。 0x0000001 < br />ではありません。 ただし、requiremntがboolまたはbinary値のみの場合は、CライブラリにC99標準を使用して設定できます。


#include 
#include 
#include 
#include         //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。

こんにちは、世界。!
                                                                                                                                                                                           1 1 1 1 1。 
解説 (0)

誰もそれを言及しなかったので。..

memsetを使用して値 1で整数を初期化することはできませんが、値 -1で整数を初期化して、代わりに負の値で作業するようにロジックを変更できます。

たとえば、配列の最初の6つの番号を「-1」で初期化するには、そうします。

memset(arr,-1,6*(sizeof int));

さらに、この初期化を1回だけ行う必要がある場合は、コンパイル時からの値「1」で開始するように配列を実際に宣言できます。

int arr[15] = {1,1,1,1,1,1};
解説 (2)

Memsetは1バイトのデータ型の値を設定しますが、整数は4バイト以上あるため、機能せず、ガベージ値を取得します。 これは、charと文字列のタイプを使用しているときに主に使用されます。

解説 (0)

次のプログラムを試しましたが、-1と0のみのmemset()を使用して配列を初期化できるようです。


#include
#include

void printArray(int arr[], int len)
{
        int i=0;
    for(i=0; i
解説 (0)
memset((char *)&tab, 0, sizeof(tab));
解説 (1)