1

関数の引数に配列を渡していますが、関数の本体で使用して最後の要素にアクセスしようとすると、arr[-1]ガベージが発生します。誰かが私になぜそうなのか説明できますか?

コードは次のとおりです。

#include<stdio.h>

using namespace std;

int binsearch(int nelement, int arr[],int maxsize)
{
    int low = 0;
    int high = maxsize;

    printf("%d",arr[-1]);
    return 0;       
}

void main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9};
    int flag = 3;
    printf("%d\n",arr[8]);
    flag = binsearch(flag,arr,sizeof(arr));
}

出力は次のとおりです。

9
-858993460
4

3 に答える 3

3

arr[-1]最後の要素にはアクセスしません。概念的には、最初の要素の前のスペースにアクセスしますが、動作は定義されていません。

最後の要素にアクセスするには、最後の要素の意味に応じてarr[nelement-1]またはを使用します。arr[NumberOfElements-1](配列に要素のみを含めることを検討してnelementいますか、それとも割り当てられた配列全体の最後の要素が必要ですか?後者の場合、最後の要素のインデックスを計算するために、配列内の要素の数を知る必要があります.)

于 2013-01-22T17:26:08.503 に答える
2

配列インデックスは符号なしでなければなりません。配列のインデックスとして負の値を使用すると、未定義の動作が発生します。


補足として:

このコードは ( int) 要素の数を関数に渡しません。

int arr[] = {1,2,3,4,5,6,7,8,9};
...
flag = binsearch(flag, arr, sizeof(arr));

sizeof演算子として、によって使用されるバイトarr数が返されます。

配列が提供するの数を渡すにはint、次の構文を使用できます。

flag = binsearch(flag, arr, sizeof(arr)/sizeof(arr[0]));
于 2013-01-22T17:42:10.630 に答える
0

maxsizesizeof(arr)であり、arr はintの配列であるため、(sizeof(int) * no_of_elements_of_arr) です。

arr[(maxsize/sizeof(int)) - 1]それは代わりになければなりませんarr[-1]

arr[-1]ガベージ値を出力することが期待されています

于 2013-01-22T17:32:18.763 に答える