0

配列内のすべての要素を合計する関数に配列を渡そうとしていますが、行で不正なアクセス エラーが発生しsum+=a[i];ます。これを修正するにはどうすればよいですか? コードは次のとおりです。

#import <Foundation/Foundation.h>

int sum(int*, int);

int main() {

@autoreleasepool {

    int size = 0;
    int a[size];
    int x;

    NSLog(@"Enter a size for the array ");
    scanf("%i", &size);

    NSLog(@"Enter %i numbers to populate the array ", size);

    for (int i = 0; i < size; i++) {
        scanf("%i", &a[i]);
    }

    x = sum(a, size);

    NSLog(@"The sum of the array is %i ", x);    
}

return 0;

}

int sum(int *a, int n) {

int sum = 0;
for (int i = 0; i < n; i++) {

    sum += a[i];
}
return sum;
}
4

2 に答える 2

3

これは、配列のサイズが 0 であるためです。a[i] からの書き込み/読み取りは、動作が定義されていないため、クラッシュする場合とクラッシュしない場合があります。

それ以外の

int size = 0;
int a[size];
int x;

NSLog(@"Enter a size for the array ");
scanf("%i", &size);

代わりにこれを行う必要があります:

int size = 0;
int *a;
int x;

NSLog(@"Enter a size for the array ");
scanf("%i", &size);

a = malloc(sizeof(int) * size);

array を動的に割り当てることによりa、プログラムがクラッシュしなくなります。

を使用した後malloc、不要になったら解放する必要があります。これを前にしてreturn 0;

free(a);

お役に立てれば。

于 2013-03-11T18:28:38.503 に答える
0

サイズ 0 の配列を定義しました。配列はメモリのブロックであり、この場合は「no」メモリのブロックであるため、配列には何も格納できません。

@Owen の回答に示されているように、malloc/free を使用できます。C99 では、スタック上で配列を宣言する機能も追加されました (いわゆる VLA、可変長配列)。これにより、malloc/free を使用する手間が省けますが、すべてのスタック スペースを使い果たす危険性があります。ファクトが制約されることがわかっている値の場合、VLA は理にかなっている可能性があります。

int size;
NSLog(@"Enter a size for the array ");
scanf("%i", &size);

int arr[size];

....

C89/C90/ANSI では、配列のサイズはコンパイル時の定数でなければならないため、これができないことに注意してください。

于 2013-03-11T19:27:34.450 に答える