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

Output:
******ful earth

上記の memset の使用のように、以下に示すように、少数の整数配列インデックス値のみを 1 に初期化できますか?

int arr[15];
memset(arr, 1, 6);
4

10 に答える 10

3

誰も言及していないので...

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

たとえば、配列の最初の 6 つの数値を で初期化するには、次のように-1します。

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

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

int arr[15] = {1,1,1,1,1,1};
于 2013-06-25T04:13:11.437 に答える
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ただし、データを順方向にコピーし、上記の方法で使用することを確認して、独自のバージョンを作成できます。しかし、それだけの価値はありません。単純なサイクルを使用して、配列の要素を目的の値に設定するだけです。

于 2013-06-25T04:37:35.553 に答える
0

理想的には、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

于 2018-09-23T06:25:02.763 に答える