15

重複の可能性:
mallocとsizeofに関する初心者の質問

文字列をプログラムに読み込もうとしています。文字列が破損していることに気付いたとき、次のコードを試しました。

 void *mallocated = malloc(100);
 printf("sizeof(mallocated) = %d\n", sizeof(mallocated));

私のプログラムによると、100バイトを割り当てたのに、のサイズはmallocatedでした。8このため、8バイトより長い文字列を保存しようとすると、8バイト目以降がすべて消えてしまうことがあります。なぜこれが起こっているのですか、そしてどうすればそれを防ぐことができますか?

4

5 に答える 5

19

「文字列」ポインタのサイズが8バイトであるためです。sizeof()適切な「サイズ」での使用例を次に示します。この用語size_of()は、それを使用することに慣れていない人々を欺くことがあります。あなたの場合、ポインタのサイズは8バイトです。以下は典型的な32ビットシステムでの表現です。

sizeof (char)   = 1
sizeof (double) = 8
sizeof (float)  = 4
sizeof (int)    = 4
sizeof (long)   = 4
sizeof (long long)  = 8
sizeof (short)  = 2
sizeof (void *) = 4

sizeof (clock_t)    = 4
sizeof (pid_t)  = 4
sizeof (size_t) = 4
sizeof (ssize_t)    = 4
sizeof (time_t) = 4

ソース

文字列が消えていると判断する方法を省略しています(char配列)。おそらく関数に渡されているので、明示的な長さを変数として渡すか、どこかで追跡する必要があります。を使用しsizeof()ても、これはわかりません。

これについての私の前の質問を見てください、そしてあなたは私の最初の理解の欠如さえ見るでしょう。

于 2010-02-14T02:12:23.940 に答える
15

C89では、sizeof演算子はコンパイル時に変数voidのサイズをバイト単位でのみ検出します(この場合は8バイトのポインター)。サイズはコンパイル時にわかっているため、プレーン配列で期待どおりに機能します。

char arr[100]; // sizeof arr == 100
char *p = arr; // sizeof p == 4 (or 8 on 64-bit architectures)
char *p = malloc(100); // sizeof p == 4 (or 8). Still!

ヒープに割り当てられたメモリのサイズを知るには、手動で追跡する必要がありますが、sizeof役に立ちません。

于 2010-02-14T02:13:24.760 に答える
9

sizeofvoid *割り当てたメモリのサイズではなく、指定したポインタ()のサイズを返します。後で使用する場合は、メモリのサイズを別の変数に保存する必要があります。

于 2010-02-14T02:14:44.277 に答える
5

それはいけません。指摘したように、あなたはvoid *間違った場所のサイズを得ることができますが、それはあなたに多くを教えてくれません。

マロのサイズはわかりませ*mallocated。つまり、独自のメモリ管理ルーチンを作成しない限り、(この例では)100を返す関数呼び出しはありません。

最も簡単なのは、どこかでそれを覚えておくことです...多分...。

stuct {
  void *data;
  unsigned int size
 } myStructureWhichRemebersItsSize;

myStructureWhichRemebersItsSize *someData;
someData.data = malloc(100);  // and check for NULL
someData.size = 100;
于 2010-02-14T02:19:01.593 に答える
-1

void*何が含まれているかわからない場合のメモリ内の場所のタイプです。避けるべきです。

char*を保持するメモリ内のある場所を指す値のタイプですchar。メモリ内の場所の識別には8バイトかかります。

sizeof特定のタイプが取るバイト数を示します。割り当てられた数ではなく、型取る必要があることをmallocコンパイラが認識しているメモリの量だけです。値に適用することはしばしば悪いスタイルと見なされ、ここで他の誰かが言及したように、C99でスマートな振る舞いを呼び出すことがあります。sizeof

char[100]100文字を保持する値のタイプ。スタック上のchar[100] a;100秒の文字列です。char

char(*)[100]100文字を保持する値へのポインタのタイプです。char(*b)[100];おそらくヒープ上で、100文字をb指します。あなたがおそらく欲しいのは

char (*s)[100] = malloc( sizeof( char[100] ) );
printf( "%u byte pointer to %u bytes of size %u elements\n",
  sizeof s, sizeof *s, sizeof **s );
于 2010-02-14T02:39:28.640 に答える