在malloc结构

时间:2015-07-20 21:20:05

标签: c struct atomic freebsd c11

我尝试使用clang 3.6.1在FreeBSD 10.1 Release上使用C中的原子,但是当我尝试在ATOMIC_FLAG_INIT变量上使用atomic_flag编译程序时在struct我得到error: expected expression

这是我正在尝试编译的程序。

#include <stdio.h>
#include <stdatomic.h>

struct map
{

    atomic_flag flag;

};

int main(void)
{
    struct map *m = malloc(sizeof(struct map));

    m->flag = ATOMIC_FLAG_INIT;

    free(m);

    return 0;
}

我可以在atomic_flag之外使用structs,如下例所示,但不能在structs中使用,那么如何在C structs中使用原子变量?

#include <stdio.h>
#include <stdatomic.h>

int main(void)
{
    atomic_flag flag = ATOMIC_FLAG_INIT;

    return 0;
}

2 个答案:

答案 0 :(得分:5)

atomic_flag没有您可以分配或读取的值,但只有内部状态。

atomic_flag交互的唯一方法是为其定义的两个函数(如果算上_explicit版本,则为四个函数)。对于您通过malloc获得对象的情况,该标志处于&#34;不确定状态&#34; (C11的7.17.8 p4)。您可以通过应用两个函数之一将其置于已知状态,即使用atomic_flag_clear将其设置为&#34; clear&#34;状态,或使用atomic_flag_test_and_set将其设置为&#34; set&#34;状态。

在使用atomic_flag_clear分配后立即使用malloc 相当于使用ATOMIC_FLAG_INIT初始化变量。

答案 1 :(得分:-1)

未初始化(atomic_flag)的

ATOMIC_FLAG_INIT未定义且此原子数据类型没有存储&amp;加载函数,所以编译器做得很好呻吟。

此外,你甚至没有为结构分配内存,只是在堆栈上创建了一个指针。