C初始化结构并通过指针进行访问

C初始化结构并通过指针进行访问,c,arrays,struct,segmentation-fault,C,Arrays,Struct,Segmentation Fault,我有点困惑,似乎我的流程是正确的,但我得到了赛格。故障(第15行) 标题中的我的结构: typedef struct ringBuf_t { uint32_t data[BUF_CAPACITY]; int head; int tail; uint32_t capacity; } ringBuf_t; 我如何使用它: ringBuf_t *create() { ringBuf_t buf = {.capacity = BUF_CAPACITY, .hea

我有点困惑,似乎我的流程是正确的,但我得到了赛格。故障(第15行)

标题中的我的结构:

typedef struct ringBuf_t {
    uint32_t data[BUF_CAPACITY];
    int head;
    int tail;
    uint32_t capacity;
} ringBuf_t;
我如何使用它:

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;
}

在第5行中,在堆栈上创建一个局部变量,当函数返回它的地址时,作用域结束,对象内存可用。因此,如果您稍后使用该地址,则会出现seg故障

请不要使用行号发布代码!从技术上讲,对象内存不是可用的,当函数
create
返回时,对象超出范围,随后取消对它的引用会调用未定义的行为,例如,因为您正在读取无效值和/或在写入时覆盖其他内容。编译器应该更加严格,有这样明显的错误,并将它们标记为错误。@chqrlie这就是
释放的
的意思(我不是故意写
删除的
)@OhadEytan:很抱歉,这是C代码,没有
删除操作符<代码>免费
有一个非常具体的含义,它不包括OP的问题。取消代码<代码>免费< /代码> D内存也调用未定义的行为,但是在上面的代码<代码> BUF 已经超出了范围。@ CHQRLY内存考虑免费使用,实际数据没有删除。除了运算符/函数的含义外,这些是英语中具有相关含义的单词。@OhadEytan:你的意思是像免费啤酒一样自由还是像言论自由一样自由?在这种情况下使用free充其量是令人困惑的;-)