2012-02-15 17 views
0

カウントが予測できない結果を返しています。時々彼らは正しい。時々全く変わった。誰でも何が間違っているのか教えていただけますか?配列の長さのカウント異常

#include <stdio.h> 
int len(int[]); 

int main (int argc, const char * argv[]) 
{ 
    int a[]={1,2,3,4,5,6,7,8}; 
    int* i = a; 
    printf("length is %d",(len(i))); 
    return 0; 
} 

int len(int* a){ 
    int count = 0; 
    for (; *a!='\0'; a++) { 
     count++; 
    } 
    return count; 
} 
+2

ええ - あなたがしようとしているのは、本質的に欠陥があります。配列の長さをCで数えることはできません。実際の配列がある場合は、#define ARRLEN(arr)(sizeof(arr)/ sizeof(* arr))を使用できますが、ポインタでは機能しません。したがって、関数に渡された配列に対して –

答えて

3

Cの文字列(配列char)と他の配列の間で混乱していると思います。 C文字列はヌル文字('\0')で終了しますが、すべての配列(charの配列も)がこのように終了するわけではありません。

通常、配列の長さをどこかに格納するか、配列の末尾にセンチネル値を使用します。この値は、配列内には出現しない値、例えば、文字列の場合は'\0'、正の整数の配列の場合は-1でなければなりません。また

、あなたはaは、int型の配列(およびないint型の配列へのポインタ)で、その後、あなたが使用できることがわかっている場合:

size_t length = sizeof(a)/sizeof(a[0]); 

だから、あなたができる:

int a[] = {1,2,3,4,5,6,7,8}; 
size_t length = sizeof(a)/sizeof(a[0]); 

// In this case, sizeof(a[0]) 
// is the same as sizeof(int), because it's an int array. 

しかし、あなたはできません:

int *a = malloc(sizeof(int) * 10); 
size_t length = sizeof(a)/sizeof(a[0]); // WRONG! 

最後の例はコンパイルされますが、答えは間違っています配列のサイズではなく、配列へのポインタのサイズを取得しています。

このsizeofを使用して、関数に渡された配列のサイズを読み取ることはできません。コンパイラは関数の引数の配列を最初の要素へのポインタに変換するので、関数len(int *a)またはlen(int a[]) - aを宣言するかどうかは関係ありません。

+0

長さは 'int'ですか? \ * shudder \ *(それを 'size_t'に修正するときには' sizeof(int) 'を' sizeof(a [0]) 'に変更することを検討してください。) –

+0

@ChrisLutzおっと、ありがとう。私は 'a [0]'の代わりに 'int'を使って計算が何であるかを明確にしましたが、代わりに言葉で表現するべきだと思います。更新しました :) –

7

あなたがそこに置かない限り、配列の最後にゼロはありません!文字列を使用して定義されたリテラルchar配列は、実際にはそのようなセンチネル値を持ちますが、特別です。他の配列には同等のものはありません。

C言語の一般的な配列に対しては、書き込みしようとしている関数を書くことができません。メモリアロケータの(ドキュメント化されていない、プラットフォーム固有の)内部関数を使用せずにダイナミック配列のサイズを決定する方法はありません。アプリケーションでこれを行うことが重要だった場合は、明示的に配列の最後にゼロを追加することができた場合にのみ行うことができます。

1

このような配列はカウントできません。文字列のみがNULLで終了します。それが確実に動作するようにするには、配列に '\ 0'を含む要素を追加する必要があります。しかし、 '\ 0'のためにあなたの長さが真の長さより大きくないことを覚えておいてください。

1

文字列とは異なり、通常の配列はnullバイト0x00で終了しません。文字列がこれを使用する理由は、配列に長さの概念がないためです。配列は単なる連続したメモリであり、配列の長さを追跡するのはあなた次第です。

関連する問題