2016-10-09 2 views
-4

私の問題は、メモリの割り当て方法がわかりません。私はそれを研究したが役に立たない。 mallocに関するいくつかの助けは素晴らしいでしょう。セグメンテーションエラーを取得する

int main(int argc, char *argv[]) { 

    int i, a[5000], c = 1, m, n, input; 

    scanf("%d", &input); 

    for (i = 0; i <= 9999; i += 2) { 

     a[c] = i; 
     c++; 

    } 

    for (n = 2; n < 1118; n++) { 

     for (m = a[n]; m < a[5000]; m++) { 

      a[m] = a[m+1]; 
     } 
    } 

    printf("%d", a[input]); 

    free (*a); 

    return 0; 
} 
+1

あなたは遠くまで検索しませんでした。あなたはSOのドキュメントを見ましたか?https://stackoverflow.com/documentation/c/4726/memory-management#t=201610092024124038819 –

答えて

2

まず、C配列は0から始まるインデックスを持ちます。 cの初期値を1に設定して、ループ内のインデックスとして使用すると、オフラインで表示されます。これによりundefined behaviorが呼び出されます。

その後、free (*a);を実行する必要はありません。aは、メモリアロケータ関数malloc()またはファミリによって返されたポインタではなく、配列です。

つまり、このコードでは、*aはポインタを与えません。a[0]と同じです。タイプはintです。

最後に、ユーザ提供値inputからのバインドチェックを行わずに、a[input]を使用すると、非常にうまくバウンドメモリからアクセスしてUBを引き起こす可能性があります。

FWIW、malloc()とファミリによって以前に返されていないfree()へのポインタを渡すと、未定義の動作も呼び出されます。

2

上記のコードでは、決して動的にメモリを割り当てることはありません。メモリを解放する必要はありません。

2

'a'はスタックに割り当てられているため、解放する必要はありません。

*allocファミリーの関数によって割り当てられた変数を解放するだけで済みます。

-1

mallocは1つの引数、つまり割り当てるバイト数をとります。 voidポインタ(任意のデータ型を保持できるメモリセクションへのポインタ)を返します。

例を示します。

int *array = malloc(sizeof(int) * 10); 

これは、整数の10要素配列を割り当てます。データの初期化は行われないので、配列の内容は未定義です。 callocという関数があり、になります。ゼロに初期化します。

また、スタイルのヒント。たとえば、int *array = (int *)malloc(sizeof(int) * 10);のように、Cプログラマがthisポストで説明されている理由のために、malloc呼び出しの結果をポインタに格納しようとする可能性があります。

+1

間違ったタブ? –

関連する問題