2016-07-24 16 views
1

Ich bin ein wenig verwirrt, schien es, dass meine Strömung richtig ist, aber ich bekomme Seg. Fehler (Zeile 15)C initialisieren struct und Zugriff durch Zeiger

Mein struct in Header:

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

und wie ich es verwenden:

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

Bitte geben Sie keinen Code mit Zeilennummern ein! – chqrlie

Antwort

3

In Zeile 5 eine lokale Variable auf dem Stapel erstellen, und wenn die Funktion return it address Der Bereich endet und der Objektspeicher ist frei. Wenn Sie diese Adresse später verwenden, erhalten Sie einen Seg-Fehler

+0

Danke, viel.) – Constantine

+0

@KostyaKrivomaz Gern geschehen –

+1

Technisch gesehen ist der Objektspeicher nicht "frei", das Objekt geht aus dem Geltungsbereich, wenn die Funktion 'create' zurückkehrt, dereferenziert danach undefiniertes Verhalten, zB weil Sie ungültige Werte lesen und/oder überschreiben Sie etwas anderes, wenn Sie darauf schreiben. Compiler sollten mit offensichtlichen Fehlern wie diesem strenger sein und sie als Fehler kennzeichnen. – chqrlie