2011-09-07 8 views
0

ので、次のように与えられる:配列の大きさはどれくらいですか?

#include <stdio.h> 
int * getarr(); 
int main(int argc, char* argv) 
{ 
    int * arr = getarr(); 
    printf("%d", sizeof(arr)); 
} 

int* getarr() 
{ 
    static int a[4] = {0,1,0,3}; 
    return a; 
} 

どのように1はarrの長さを見つけるのですか? arr[4] == 0ですが、arr[0]arr[2]もあります。

これがchar*の場合、回答はiterate until '\0'となりますが、ここでは'\0' == 0としては機能していないようです。 1(私のシステム上のint型のサイズ)が、それは単に空のように私を打つように、その信頼性の高い指標ではないようです - arr[5]缶への対処

は16 >一貫値になるように思われますメモリ内の位置。

この値を一貫して取得する方法はありますか?それとも単に渡されなければならないのでしょうか?

+4

'arr [4]'以上は未定義の動作です。 – Mat

+0

@Mat、私は信じていたが、それは関連性があるように思えた。 – cwallenpoole

+0

次のように同じです:http://stackoverflow.com/questions/2089071/array-length-in-c – Nik

答えて

4

main()機能では、アレイの長さを調べることはできません。 int[4]int *に変換されたときにこの情報が失われましたgetarr()

0

Cで知る方法はありません。C配列は単なるメモリへのポインタなので、基になるポインタ型と同じサイズです。

したがって、長さを他の場所に保存する必要があります。

+0

エラーは、配列はポインタではなく、非常に多くのコンテキストでポインタに減衰します。 –

+0

そうです、配列はポインタではありません。しかし、両方を参照する識別子の型は同じです。すなわち、 'int a [5]'として宣言された型は 'int * b'と同じですか?それがアヒルのように歩き、アヒルのように突き刺すなら、私はそれをアヒルと呼びます。 –

+1

sizeof(int [30])!= sizeof(int *) '私が知っているどのシステムでも。したがって、タイプは同じではありません。配列( 'int(*)[30]')へのポインタを作ることはできますが、ポインタへのポインタ( 'int **')とはまったく同じではありません。両方をインデックス化することはできますが、索引付け可能な連続したデータのブロックを生成し、後者は、索引付け可能な他のデータへのポインタを生成します。 –

2

明示的にサイズを渡す以外に、その配列の長さが見つかりません。

3

自分で配列のサイズを把握しておく必要があります。あなたのためにそれを行う言語はありません。ごめんなさい。

これは、人々がより強力なデータ構造を含む上位レベルの言語を使用する理由の1つです。 std::vector<T>

1

C配列はメモリ内のバイト列です。Java、Pythonなどの言語ではパスカル文字列や他の「配列のような」データ構造とは異なり、実行時境界チェックがあります。配列のサイズに関する情報を実際の配列データと結合させます。したがって、配列が静的に割り当てられている場合を除いて、配列のサイズを渡す必要があります。その場合は、sizeof(array)を使用できます。

関連する問題