2017-11-24 10 views
-1

私はCで配列メソッドへの書き込みを試みてきましたが、期待通りの結果を返さないようです。C - ポインタと配列

How many numbers would you like to short?: 3 
Checking for the i: 0: 1 
Setting the number to temp 1 
Checking for the i: 1: 2 
Setting the number to temp 2 
Checking for the i: 2: 3 
Setting the number to temp 3 
Setting the array2 to *array 
0: 6487440 
1: 0 
2: 6480512 

---------------------------------- 
Proces exited after 1.741 seconds with return value 3 

そして、これは私も のscanf( "%dの" & *配列[I])を使用して試みたコード

int array_size; 

void getArray(int *array[]); 
void printArray(int array[]); 

void main() { 
    printf("How many numbers would you like to short?: "); 
    scanf("%d", &array_size); 

    int input[array_size]; 

    getArray(&input); 

    printArray(input); 
} 

void getArray(int *array[]) { 
    int i, temp; 
    int array2[array_size]; 
    for(i = 0; i < array_size; i++) { 
     printf("Checking for the i: "); 
     printf("%d: ", i); 
     scanf("%d", &temp); 
     printf("Setting the number to temp %d\n", temp); 
     array2[i] = temp; 
    } 

    printf("Setting the array2 to *array\n"); 
    *array = array2; 
} 

void printArray(int array[]) { 

    int i; 
    for(i = 0; i < array_size; i++) { 
     printf("%d: %d\n", i, array[i]); 
    } 



} 

あります。 でも動作しません。

私が間違っていることは何ですか? ありがとうございます!

+0

'* array = array2;'と書いて何をしますか? –

+0

これをコンパイルしようとすると警告が表示されませんか?警告をデフォルトレベルに戻しても、gccで8つの警告が表示されます。これらを最初に修正してください。 –

+0

常にテキストを表示し、写真を表示しない。 (あなたのためにそれを修正しました。) – DevSolar

答えて

1

ここでは多くのことが間違っています。まず、配列を渡していない配列を渡すことは、単に getArray(&input); --> getArray(input);になります。

関数に渡された1D配列は、ポインタに崩壊するため、呼び出された関数内で(ポインタを介して)配列に加えられた変更を保持することができます。

void getArray(int *array) { 
    int i, temp; 
    for(i = 0; i < array_size; i++) { 
     printf("Checking for the i: "); 
     printf("%d: ", i); 
     scanf("%d", &array[i]); 
    } 
} 

これは、何でもしたいことを行います。しかし、関数が}に達すると、自動変数の割り当てが解除されるため、割り当てが間違っていました。したがって、関数スコープ外でそれにアクセスすると、未定義の動作が発生します。


あなたにもっと精巧なアイデアを与えるために、いくつかのことは(ほとんどのエラーメッセージが議論されている)があります。

コードをコンパイルすると、エラーが発生します。エラーメッセージを見てください。 error: cannot convert 'int (*)[array_size]' to 'int**' for argument '1' to 'void getArray(int**)'

&inputは、int(*)[array_size]です。これは、それがarray_sizeの整数の配列へのポインタであることを意味します。

エラーメッセージを見れば、int**ここからはgetArray()の引数に来るでしょうか?

さてあなたはarrayint* -sの配列であることを意味している(あなたはその関数がパラメータとしてこれを受け取ることになります宣言)int* array[]を集めています。今、それは最初の要素へのポインタに崩壊します。

ここで要素は何ですか?それはポインタです。

ポインタへのポインタは何ですか?はい、それはint**です。

変換できないというエラーがスローされます。

0

デカールした場所を見てくださいarray2getArray()のスコープを終了するとすぐにそのメモリはに割り当てられます。だから、後でそれにアクセスしようとすると、その瞬間の記憶にあるもので終わります。