char str[] = "beautiful earth";
memset(str, '*', 6);
printf("%s", str);
Output:
******ful earth
上記の memset の使用のように、以下に示すように、少数の整数配列インデックス値のみを 1 に初期化できますか?
int arr[15];
memset(arr, 1, 6);
誰も言及していないので...
1
memset を使用して値で整数を初期化することはできませんが、値で整数を初期化し、代わりに負の値で動作するようにロジックを変更することができます。-1
たとえば、配列の最初の 6 つの数値を で初期化するには、次のように-1
します。
memset(arr,-1,6*(sizeof int));
さらに、この初期化を 1 回だけ行う必要がある場合は1
、コンパイル時の値で始まる配列を実際に宣言できます。
int arr[15] = {1,1,1,1,1,1};
いいえ、memset
目的のターゲット値が0
. memset
ターゲット メモリ領域を s の配列ではなく、バイトの配列として扱いますint
。
メモリ領域を繰り返しパターンで埋めるためのかなり一般的なハックは、実際には に基づいていmemcpy
ます。memcpy
データを順方向にコピーするという期待に大きく依存しています
int arr[15];
arr[0] = 1;
memcpy(&arr[1], &arr[0], sizeof arr - sizeof *arr);
memcpy
ソースとデスティネーションのメモリ領域が重なっている場合、標準の動作は定義されていないため、これはもちろんかなり醜いハックです。memcpy
ただし、データを順方向にコピーし、上記の方法で使用することを確認して、独自のバージョンを作成できます。しかし、それだけの価値はありません。単純なサイクルを使用して、配列の要素を目的の値に設定するだけです。
理想的には、memset を使用して配列をすべて 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