2017-02-05 5 views
0

ユーザパラメータを取得してそれらから整数配列を作成するCコードを記述しています。私は配列の長さと各要素の値を提供するようにユーザーに頼みます。グローバル整数配列へのアクセス時にセグメンテーションフォルトが発生する

次のコードを実行すると、printArray()関数呼び出しでエラーが発生します。私が代わりに関数呼び出しを行うのmain()printArray()コードをコピーしたときに、配列が正しく印刷されます。)(プリントアレイにデバッガに続いて、セグメンテーションフォールト自体はprintf("%d", intArray[i])

NOTEで起こります。これにより、私はグローバル変数やポインタに関する問題があると思います。私はまだCを学んでいるので、あなたの指導は高く評価されます。

どうすればこの問題を解決できますか?詳細は下のデバッガ出力を参照してください。

void printArray(); 

int arraySize; 
int* intArray; 

int main() { 

    printf("Enter array length:\n"); 

    scanf("%d", &arraySize); 
    int* intArray = (int*) malloc(sizeof(int)*arraySize); 

    printf("Enter an integer value for each array element:\n"); 
    for (int i = 0; i < arraySize; i++) { 
     printf("Enter element %d:\n", i); 
     scanf("%d", &intArray[i]); 
    } 

    printArray(); 
    return 0; 
} 

void printArray() { 
    printf("["); 

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

debugger output

+0

複数のスレッドを使用していますか? –

+0

いいえ、少なくとも意図的にではありません。 Rajeshが以下の解決策を投稿したが、私はその「スレッド2」の部分について疑問を抱いている。多分main()は独自のスレッドを取得しますか? –

答えて

2

が、私はこれを行うことにより、あなたは

int* intArray = (int*) malloc(sizeof(int)*arraySize); 

)(メインにintArray変数を再宣言していると思いますが、この変数のスコープは)(本体のみ機能し、プリントアレイではないですこの定義を知らないしたがって、printArray()は、グローバルに宣言した(定義を持たない)intArray変数にアクセスしようとします。そのため、セグメント化エラーが発生します。

intArray = (int*) malloc(sizeof(int)*arraySize);

+0

ありがとうございます。私は 'printArray()'の使用を明示するために 'intArray'宣言をグローバルスペースに移動し、' main() '内部の宣言部分を削除するのを忘れました。 –

関連する問題