0
int main()
{
    int* p= (int*)malloc(8);

    for(i=0;i<128;i++)
    p=0;

}

128 ビットすべてにすべてゼロを割り当てたい。上記のコードは正しいですか?説明が欲しい。私の目的は、128 ビットを 1 つの変数に割り当て、すべてのゼロを 128 ビットすべてに割り当てることです。

4

7 に答える 7

5

いいえ。ポインター自体に 0 を割り当てるだけです (そのため、ポインターが失われ、メモリ リークが発生します)。これを使って:

(編集: Jim Balter が指摘したように、8 ビット以外の文字を扱うのは簡単です:)

int main()
{
    unsigned n = (128 + CHAR_BIT - 1) / CHAR_BIT;
    unsigned char *p = malloc(n);

    for(i = 0; i < n; i++)
    p[i] = 0;
}

しかし、これは車輪の再発明です。なぜ標準機能を使わないのmemset()ですか?

int main()
{
    unsigned n = (128 + CHAR_BIT - 1) / CHAR_BIT;
    unsigned char *p = malloc(n);

    memset(p, 0, n);
}
于 2012-08-08T11:08:13.787 に答える
2

うわー、それについては分解することがたくさんあります...

1) 64 ビットである 8 バイトを割り当てます。

2) 128 まで繰り返すと、次の場合を除き、バッファ オーバーフローが発生します。

3) ループでは、割り当てられた最初のバイトのみを 0 に設定します

これを行うには 2 つの方法があります。

p = malloc(128/8);
for (i = 0; i < (128/8); i++)
    p[i] = 0;

または、すべての POSIX オペレーティング システムで提供されている memset(3) 関数を使用することもできます。

于 2012-08-08T11:09:01.483 に答える
2

割り当ててクリアするのではなく、calloc()もっと良いと思います。

int* p= (int*)malloc(8);

8 バイト、つまり 8*8 = 64 ビットのみを割り当てました。

#include <stdio.h>
#include <stdlib.h>
int main()
{

int i = 0;
char *p = calloc(16, sizeof(char));

//for Testing
for(i = 0; i < 16; i++)
  printf("%d\t", *p++);

return 0;
}
于 2012-08-08T11:15:25.980 に答える
1

単純にmemsetルーチンを使用して、nned と同じ数のバイトを無効にすることができます。次のようになります。

uint8_t* p= (uint8_t*)malloc(16);
memset(p, 0, 16);

128 ビット (つまり 16 バイト) が必要な場合は、8 を 16 に置き換える必要があることに注意してください。

更新しました:

整数型のサイズはシステムに依存するため、uint8_ttypedef を使用すると、使用している型が実際には 8 ビット長であることが確信できます。この typedef (および固定サイズの他の整数型の型定義) は、stdint.h. このヘッダーを使用できない場合は、これらの typedef を自分で作成できます。たとえばtypedef unsigned char uint8_t、ほとんどのシステムに当てはまります。

コードが後で異なる整数サイズのシステムに移植された場合、サイズの非互換性の問題について心配する必要はありません。必要なのは、単に(u)intX_t(u - 符号なし、X - ビット数) typedef を変更することだけです。

于 2012-08-08T11:08:37.677 に答える
1

int は、プラットフォームによっては 4 バイトを割り当てる場合があります。代わりに char を使用します。

char* p= (char*)malloc(16);
for(i=0;i<16;i++)
    p[i]=0;
于 2012-08-08T11:12:34.100 に答える
0

上記のコードは、コンテンツではなくポインターに 0 を割り当てます。

コンテンツを初期化するには、memset を使用します。

memset(p, 0x00, 8);

またはポインターを逆参照します。

for(i=0;i<8;i++)
    p[i]=0;
于 2012-08-08T11:07:47.993 に答える
0

calloc( )割り当てとゼロに使用します。

于 2012-08-08T12:59:35.577 に答える