2016-07-24 2 views
1

약간 혼란 스럽다. 내 흐름이 옳았지만 Seg을 얻고있는 것처럼 보였다. 오류 (라인 15) 헤더C 구조체 초기화 및 포인터로 액세스

내 구조체 :

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

5 호선에서 당신은 스택에 로컬 변수를 만들 때 기능 :

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

을하고 어떻게 그것을 사용 스코프가 끝나고 객체 메모리가 자유인 주소를 반환하십시오. 따라서 나중에 해당 주소를 사용하면 seg-fault가 발생합니다.

+0

감사합니다.) – Constantine

+0

@KostyaKrivomaz 여러분, 환영합니다 –

+1

기술적으로 객체 메모리는'free'd가 아닙니다. 함수'create'가 반환 될 때 객체가 범위를 벗어나게됩니다. 이후에 참조 해제하면 정의되지 않은 동작이 호출됩니다. 예를 들어 잘못된 값을 읽고 있기 때문에/또는 쓸 때 다른 것을 덮어 씁니다. 컴파일러는 이와 같은 명백한 버그로 인해 더 엄격 해지고 오류로 표시해야합니다. – chqrlie