2016-11-20 8 views
-1

cで多次元配列を作成しようとしています。テスト目的のために、私は最初の行の最初の要素を印刷しようとしています。コードはその時点まで機能するようです。しかし、私は要素をもう一度印刷しようとすると、私はセグメンテーションフォールトを取得:配列の要素を2回印刷すると、セグメンテーションフォールトが発生する

#include <stdbool.h> 
#include <stdio.h> 

typedef struct Matrix { 
    bool** elem; 
    int length; 
} Matrix; 

void generateMatrix(Matrix* m); 

int main() { 
    Matrix m = {0, 0}; 
    generateMatrix(&m); 

    fprintf(stdout, "%d ", m.elem[0][0]); 

    fprintf(stdout, "\n"); 

    // Comment next line if you want it to work 
    fprintf(stdout, "%d ", m.elem[0][0]); 

    return 0; 
} 

void generateMatrix(Matrix* m) { 
    const int size = 2; 

    bool* ptrArray[size]; 
    bool ptr1[] = {false, false}; 
    bool ptr2[] = {true, true}; 

    ptrArray[0] = ptr1; 
    ptrArray[1] = ptr2; 
    m->elem = ptrArray; 
    m->length = size; 
} 

私はUbuntuの上でGCCを使用しています:

$ gcc --version 
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 

なぜこの出来事はありますか?

答えて

1

問題はここにgenerateMatrix

である:

bool* ptrArray[size]; 
... 
m->elem = ptrArray; 

あなたが関数呼び出しに限定されている寿命ローカル変数、上の参照を使用しているが、あなたは戻りオブジェクトに格納し。

したがって、未定義の動作が発生します。

初めてラッキーですが、2度目には何らかの形でメモリが上書きされます(関数呼び出しはスタックを頻繁に変更し、ローカル変数はしばしばスタックに格納されます)。

修正:メモリがグローバル寿命を持っていることを

bool* ptrArray = malloc(size*sizeof(ptrArray[0])); 

:あなたは、実際にいくつかのメモリを割り当てる必要があります。 freeがなければ収集できません。

関連する問題