2016-10-12 5 views
-1

配列の長さを取得するために自分自身の関数に問題があります。 コード:c lang - ポインタによる異なる配列の長さ

#include <stdio.h> 
int main() { 
    int a[] = {5,4,1,2,1}; //len -> 6!! FAIL! WHY? 
    //int a[] = {5,4,1,2}; //len -> 4 OK! 
    int len = 0; 
    int *p = a; 
    while(*p != '\0'){ 
      printf("%d\n", *p); 
      len++; 
      *p++; 
    } 
    printf("len: %d\n", len); 
    return 0; 
} 

出力上のコード:

5 
4 
1 
2 
1 
32767 
len: 6 

が、INT [] = {5,4,1,2}この配列。 - len = 4 - okを生成します。

なぜ起こるのですか?

+3

これは未定義の動作です。アレイにはヌルターミネータはありません。 – tkausl

+3

C文字列は配列です。しかし、それは双射ではありません。配列はCの文字列ではありません。 – Olaf

答えて

2

アレイの最後に0が存在しないため失敗します。自動的には追加されません。明示的に行う必要があります。その結果、配列の外側にアクセスした結果、未定義の動作が発生します。あなたのテストの1つがうまく動作したように見えるという事実は、純粋に運がありました。あなたはそれに頼ることはできません。あなたは、例えばをchar配列を初期化するために、文字列リテラルを使用する場合

int a[] = {5, 4, 1, 2, 1, 0}; 

C自動的にヌルターミネータを追加するだけです

char c[] = "abcde";