2016-07-24 16 views
1

私はちょっと混乱しています。私の流れは正しいと思われましたが、私はセグを得ています。断層(ライン15)ヘッダー内C構造体を初期化してポインタでアクセスする

私のstruct:

typedef struct ringBuf_t { 
    uint32_t data[BUF_CAPACITY]; 
    int head; 
    int tail; 
    uint32_t capacity; 
} ringBuf_t; 

とどのように私はそれを使用する:5行目で

ringBuf_t *create() { 
    ringBuf_t buf = {.capacity = BUF_CAPACITY, .head = 0, .tail = 0}; 

    return &buf; 
} 

int push(ringBuf_t *buf, uint32_t item) { 
    if (buf->head + 1 == buf->tail) { 
     return -1; 
    } 

    buf->data[buf->head] = item; 
    buf->head = (buf->head + 1) % buf->capacity; 

    return 0; 
} 
+1

行番号のコードを投稿しないでください! – chqrlie

答えて

3

あなたは、スタック上のローカル変数を作成し、機能スコープが終了し、オブジェクトメモリが空いているアドレスを返します。したがって、そのアドレスを後で使用すると、seg-faultが発生する

+0

ありがとうございました。 ) – Constantine

+0

@KostyaKrivomazあなたは大丈夫です –

+1

技術的には、オブジェクトメモリは 'free'dではありません。関数' create'が返ってくるとオブジェクトはスコープから外れてしまい、その後逆参照すると未定義の動作が呼び出されます。 /またはそれに書き込むときに他のものを上書きする。コンパイラはこのような明白なバグを厳しくして、エラーとしてフラグを立てるべきです。 – chqrlie

関連する問題