int main()
{
int* p= (int*)malloc(8);
for(i=0;i<128;i++)
p=0;
}
128 ビットすべてにすべてゼロを割り当てたい。上記のコードは正しいですか?説明が欲しい。私の目的は、128 ビットを 1 つの変数に割り当て、すべてのゼロを 128 ビットすべてに割り当てることです。
int main()
{
int* p= (int*)malloc(8);
for(i=0;i<128;i++)
p=0;
}
128 ビットすべてにすべてゼロを割り当てたい。上記のコードは正しいですか?説明が欲しい。私の目的は、128 ビットを 1 つの変数に割り当て、すべてのゼロを 128 ビットすべてに割り当てることです。
いいえ。ポインター自体に 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);
}
うわー、それについては分解することがたくさんあります...
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) 関数を使用することもできます。
割り当ててクリアするのではなく、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;
}
単純にmemset
ルーチンを使用して、nned と同じ数のバイトを無効にすることができます。次のようになります。
uint8_t* p= (uint8_t*)malloc(16);
memset(p, 0, 16);
128 ビット (つまり 16 バイト) が必要な場合は、8 を 16 に置き換える必要があることに注意してください。
更新しました:
整数型のサイズはシステムに依存するため、uint8_t
typedef を使用すると、使用している型が実際には 8 ビット長であることが確信できます。この typedef (および固定サイズの他の整数型の型定義) は、stdint.h
. このヘッダーを使用できない場合は、これらの typedef を自分で作成できます。たとえばtypedef unsigned char uint8_t
、ほとんどのシステムに当てはまります。
コードが後で異なる整数サイズのシステムに移植された場合、サイズの非互換性の問題について心配する必要はありません。必要なのは、単に(u)intX_t
(u - 符号なし、X - ビット数) typedef を変更することだけです。
int は、プラットフォームによっては 4 バイトを割り当てる場合があります。代わりに char を使用します。
char* p= (char*)malloc(16);
for(i=0;i<16;i++)
p[i]=0;
上記のコードは、コンテンツではなくポインターに 0 を割り当てます。
コンテンツを初期化するには、memset を使用します。
memset(p, 0x00, 8);
またはポインターを逆参照します。
for(i=0;i<8;i++)
p[i]=0;
calloc( )
割り当てとゼロに使用します。