7

ポインタのデータのサイズを取得する方法を確認するために、次のコードを試しました。

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

 int main(){
  char *test_char_ptr = "This is just a test";
  int *test_int_ptr = (int *) malloc(16*sizeof(int));
  for(int i = 0; i<16; i++){
    test_int_ptr[i] = i;
  }
  printf("%s\n",test_char_ptr);
  printf("Test char 1: %d\n", (int)sizeof test_char_ptr );
  printf("Test char 2:%d\n", (int)sizeof *test_char_ptr );
  printf("Test char 3: %d\n", (int)((strlen(test_char_ptr)+1) * sizeof(char)));
  printf("Test int 1:%d\n", (int)sizeof test_int_ptr );
  printf("Test int 2:%d\n", (int)sizeof *test_int_ptr );
  return EXIT_SUCCESS;
 }

そして、コードの出力は(32ビットgcc 4.3の場合):

This is just a test
Test char 1: 4
Test char 2:1
Test char 3: 20
Test int 1:4
Test int 2:4

sizeof(* test_char_ptr)を使用すると、*test_char_ptr内のデータのサイズがわかると思いました。しかし、代わりに1が返されました。これは、データではなくcharのsizeofだと思います。test_int_ptrについても同じです。簡単に言うと、私の質問は、ポインタまたは動的にメモリが割り当てられた配列内のデータのサイズを取得するにはどうすればよいかということです。

4

5 に答える 5

15

これは、情報を自分で管理せずにCで実行できることではありません。アレイを作成したので、ある時点でそれらのサイズを知っていたので、自分でそれを追跡する必要があります。役立つデータ構造を作成することも、データ構造をまったく使用せずに配列とサイズの情報を注意深く維持することもできます。

さらに、コードはstrlen()文字列のサイズを取得するために使用しています。返されるサイズには終了ヌル文字('\0')が含まれないことに注意してください。文字列定数のメモリ内サイズはですstrlen(string) + 1

于 2009-10-15T07:22:22.623 に答える
5

sizeof配列のフルサイズがコンパイル時に静的にわかっている場合にのみ、そのフルサイズを認識します。ポインタの場合、メモリアドレスのサイズ、つまり32ビットの場合は4、64ビットの場合は8を返します。

ポインタを使用する場合、ポインタが指すデータのサイズを把握して追跡するのはあなた次第です。言語の実装では、配列の場合のようにそれを行うことはできません。

于 2009-10-15T07:22:23.950 に答える
5

ポインタは、それが指す(最初の)オブジェクトの後ろに割り当てられているオブジェクトの数を追跡しません。それはできないからmalloc()です。最初の要素のアドレスを返すだけで、それ以外は何も返しません。

そのため、動的に割り当てられた配列のサイズを確認する方法はありません。あなたはあなた自身のためにそれを追跡しなければなりません。

于 2009-10-15T07:22:49.167 に答える
3

これを行うための標準的な方法はありません。割り当てられたメモリの長さを別の変数に保持するか、追跡する「コンテナ」を使用する必要があります。

一部のプラットフォームには、割り当て内のバイト数を見つけるための関数があります。たとえば、AllocSize(ptr)関数としてのSymbianです。

于 2009-10-15T07:22:37.873 に答える
2

ポインタは、データの開始位置のみを指します。データのサイズについては何も知りません。

于 2009-10-15T07:25:40.183 に答える