2012-02-22 24 views
2

私は配列(メモリ内の配列)のポインタを持っています。 ポインタから配列のサイズを計算することはできますか? 私は実際にどこの配列がメモリにあるのか分かりません。 私はポインタアドレスを取得しています(仮定9001) そのアドレスを使用して私は配列のサイズを計算する必要があります。ポインタ変数から配列のサイズを計算するには?

ありがとうございました。

+2

必要があり、これは[C#の]タグ付けされることを意味していますか?実際に[C]に問題があるようです。 – porges

+0

これはC++テンプレートのほうが簡単です... – Lalaland

+0

この質問に '[C]'または '[C++]'のどちらかとしてください。この質問では、1つの言語に適用できる回答は、他の言語には適用されません。 –

答えて

11

いいえ、配列のサイズを計算することはできません。 C言語のオブジェクトは型情報を持ちませんので、事前に配列のサイズを知っておく必要があります。このような何か:

void my_function(int array[], int size); 
+0

個人的には、 'int array []'を関数のパラメータとして使用することを控えてください。原則として、 'array'は1つ以上の' int'のうちの最初のものへのポインタであることを伝えることで、読者を助けるかもしれません。実際には、(1) 'size'はすでにそれを伝えています。 (2)人々は 'char * 'にも対処できるように' char [] 'ではなく、文字列の最初の文字にポインタを渡すときに' char * 'を使うのに慣れています。 (3)異なる構文は、初心者が誤って「int * array」と何とか違っていると考えてしまうことがよくあります。 –

+0

質問が簡単になればなるほど、自転車の脱落が大きくなります。 –

+1

ええ、あなたはおそらく正しいでしょう。配列(とその最初の要素へのポインタ)がどのように動作するのか混乱/無知であるという質問で、配列(そして最初の要素へのポインタ)の働きを人に混乱させるものは、正解の栄光に比べて些細なものです。 –

5

あなたがCでポインタのサイズをこれを行うことはできませんが、ポインタのサイズではなく、それはがでを指している可能性のある配列のサイズです。

配列を指すポインタ(char *pch = "hello";のような明示的なものや、関数に配列を渡すなどの暗黙のうちに配列の崩壊を暗黙的に指定するもの)になった場合は、サイズ情報を個別に保持する必要があります以下のような:

int twisty[] = [3,1,3,1,5,9]; 
doSomethingWith (twisty, sizeof(twisty)/sizeof(*twisty)); 
: 
void doSomethingWith (int *passages, size_t sz) { ... } 

次のコードは、このことを示しています

#include <stdio.h> 

static void fn (char plugh[], size_t sz) { 
    printf ("sizeof(plugh) = %d, sz = %d\n", sizeof(plugh), sz); 
} 

int main (void) { 
    char xyzzy[] = "Pax is a serious bloke!"; 
    printf ("sizeof(xyzzy) = %d\n", sizeof(xyzzy)); 
    fn (xyzzy, sizeof(xyzzy)/sizeof(*xyzzy)); 
    return 0; 
} 

私のシステム上の出力は次のとおりです。

sizeof(xyzzy) = 24 
sizeof(plugh) = 4, sz = 24 

24バイト配列が関数呼び出しで4バイトのポインタに減衰するためです。

+0

'fn()'の 'sz'を' 6'にするべきではありませんか? – liwp

+0

いいえ、配列に24バイトあります。 "Paxは深刻な虫です!"私はそれ以上の整数配列と混同していると思う。 – paxdiablo

+0

おっと、申し訳ありませんが、前の例から 'xyzzy = [3,1,3,1,5,9]'と考えていました。両方の例で同じ 'xyzzy'値を使用するかもしれませんか? – liwp

0

Cの配列にはこの情報がありません。このデータで配列に変数 "next"を保持する必要があります。

自分が配列を持っていれば、sizeofを使用してコンパイル段階でサイズを取得できます。

char array1[XXX]; 
char* pointer1 = array1; 
sizeof(array1); // this is XXX 
sizeof(pointer1); // this is the size of a pointer in your system 

次の操作を行うと、あなたのプログラムで変数を使用する(または、関数に配列を渡すときに機能するためにそれを渡す)

int array1size = sizeof(array1); 
関連する問題