3

ポインタを使用して整数の配列をループしようとしていますが、奇妙な値が返されます。

int nums[1] = { 1 };
int *p = nums;
while(*p != NULL) {
    cout << " LOOPING, p is " << *p << endl;
    p++;
}

実行しているとき、次の出力が表示されます。

 LOOPING, p is 1
 LOOPING, p is -858993460
 LOOPING, p is 4454504
 LOOPING, p is 3032019

なぜ私はそれらの奇妙な値を取得するのですか?NULLポインターを取得するまでループしているため、「1」のみが表示されます。各ループで次のポインターを移動します。

4

7 に答える 7

8
while(*p != NULL) {

比較は2つの理由で間違っています:

  • *pは整数であり、NULL暗黙のようなポインタではありません
  • 配列は0で終了していないためNULL、派手な0のように扱われても機能しません

あなたは試すことができます:

int nums[] = {1, 0};
while(*p)
于 2012-08-15T19:16:54.623 に答える
4

配列の境界を超えて、ガベージ値を調べています。配列のサイズは1で、が含まれています1。そのため、しばらくの間の条件が満たされていません(または、ある時点で、偶然に問題が発生した可能性があります)。

于 2012-08-15T19:17:42.983 に答える
3

条件が間違っています。配列の最後でポインターがNULLにならないため、配列の境界を超えていることになります。

また、*ポインタでonを使用すると、ポインタが指すメモリの値が取得されます。つまり*p、あなたの場合は「pが指している値を取る」という意味です。

于 2012-08-15T19:17:02.407 に答える
2

他の回答は、コードが機能しない理由を既にカバーしています-ループ用の別のオプションを追加したかっただけです:

int main()
{
    int nums[] = { 1, 5, 7 };

    int *pEnd = nums + sizeof(nums)/sizeof(int) - 1; // point to last element
    int *p = nums;

    while(p <= pEnd) {
        cout << " LOOPING, p is " << *(p++) << endl;
    }
    return 0;
}
于 2012-08-15T19:24:19.737 に答える
0
int GetSize(int a[]){
    int ptr=0;
    while(a[ptr]!= NULL){
        ptr++;
    }
    return --ptr;
}
于 2015-12-08T19:22:12.603 に答える