1

重複
の可能性: sizeof (配列を指すポインター) を見つける方法

たとえば、malloc を使用して char ポインターを宣言する場合。割り当てられた長さを決定する方法はありますか。

例、char 配列を定義すると、要素の数を簡単に見つけることができます

char a[10];
a[0]='c';
cout << sizeof(a) / sizeof(a[0]);

一方、char ポインターで試した場合は 10 になります。

char *a;
a = (char*)malloc(10);
a[0] = 'c';
cout << sizeof(a) / sizeof(a[0]);

これは明らかにポインターのサイズであり、割り当てられた長さではありません。

char ポインターの割り当てられた長さを見つけることは可能ですか?

std::string などを使用せずにこれを尋ねている理由は、インタビューの質問をクラックしているときにこの質問に出くわしたためです。だから好奇心から

4

2 に答える 2

6

SomeRandomGuyOnSO:

いいえ、ちがいます。

自分:

はい、そうですが、非標準でプラットフォームに依存します。

それとは別に、標準 C++ コンテナーの使用に関するすべての良いアドバイスは繰り返さないでおきます。代わりに、実際にあなたの質問に答えさせてください。トピックについて簡単な Google 検索を行うと、これを行う方法が表示されます。例:

// OS X
#include <malloc/malloc.h>

char *buf = malloc(1024);
size_t howManyBytes = malloc_size(buf);
printf("Allocated %u bytes\n", (unsigned)howManyBytes);

// Linux
#include <malloc.h>

char *buf = malloc(1024);
size_t howManyBytes = malloc_usable_size(buf);
printf("Allocated %u bytes\n", (unsigned)howManyBytes);

// Windows, using CRT

char *buf = malloc(1024);
size_t howManyBytes = _msize(buf);
printf("Allocated %u bytes\n", (unsigned)howManyBytes);

3 つのスニペットはすべて 1024 以上を出力するはずです。

于 2012-10-05T15:56:38.257 に答える
2

malloc() は配列やその他のことを実際には認識していません。メモリのブロックを割り当てるだけです。このスペースのサイズは、個別に追跡しない限り利用できません。これが、配列に作用するほとんどのメソッドが、配列と長さの 2 つの引数を取る理由です。

于 2012-10-05T15:46:17.047 に答える