2016-08-17 4 views
1

ここに私が持っているコードです。例えばCの動的配列が私にアクセス違反を与えるのはなぜですか?

int *arr; // Indented this line 
int sizeOfArr = 0; 

printf("Enter size of arr.\n"); 
scanf("%d", &sizeOfArr); 

arr = malloc(sizeOfArr * sizeof(int)); 

for (int i = 0; i < sizeOfArr; i++) { 

    scanf("%d", arr[i]); 

} 

、ダイナミックアレイのサイズは5であり、そしてIは入力を入力するために進んで「1 2 3 4 5」、プログラム全体がクラッシュし、私にアクセス違反を与えた場合。配列要素を格納するために

+12

'のscanfであろう( "%のD"、ARR [I]);' - > 'のscanf( "%dの"、およびARR [I]);'又は'scanf("%d "、arr + i);' – BLUEPIXY

+0

また、忘れた場合に備えて適切なヘッダファイルが含まれているかどうかを確認してください。 – d3r1ck

+0

@BLUEPIXYありがとう、それは動作するようでした!しかし、arrがすでにポインタそのものであるときに、なぜアドレスポインタを使用しなければならないのですか? – user2519193

答えて

3

あなたは変数のアドレスを参照するために使用されるCに代わり scanf("%d", arr[i]);

&scanf("%d", &arr[i]);を使用する必要があります。したがって、&arr[i]を使用すると、入力変数ithのインデックスを配列arr[]に格納するようにプログラムに指示しています。

だから正しいコードが

int *arr; 
int sizeOfArr = 0; 

printf("Enter size of arr.\n"); 
scanf("%d", &sizeOfArr); 

arr = malloc(sizeOfArr * sizeof(int)); 

for (int i = 0; i < sizeOfArr; i++) { 

    scanf("%d", &arr[i]); //notice the diff here 

} 
関連する問題