Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向静态分配结构的全局指针_C_Pointers_Struct - Fatal编程技术网

C 指向静态分配结构的全局指针

C 指向静态分配结构的全局指针,c,pointers,struct,C,Pointers,Struct,我想要一个指向静态分配结构的全局指针 这就编译了 struct sa{ int a, b; char const* c; }; struct sa* sap = &(struct sa){42,43,"x"}; 但这是合法的便携式C,还是我必须做类似的事情 static struct sa x = {42,43,"x"}; struct sa* sap2 = &x; 显然,根据6.5.2.5复合文字,5: 复合文字的值是未命名对象的值 由初始值设定项列表初始

我想要一个指向静态分配结构的全局指针

这就编译了

struct sa{
    int a, b;
    char const* c;
};
struct sa* sap = &(struct sa){42,43,"x"};
但这是合法的便携式C,还是我必须做类似的事情

static struct sa x = {42,43,"x"};
struct sa* sap2  = &x;
显然,根据6.5.2.5复合文字,5:

复合文字的值是未命名对象的值 由初始值设定项列表初始化。如果出现复合文字 在函数体之外,对象具有静态存储 期间否则,它将具有与关联的自动存储持续时间 封闭块

在全球范围内使用时是合法的


谢谢你让我知道这个构造的名称,这样我就可以查到它了。;)

在全局作用域中使用时是合法的,但它需要一个文本的地址,因此如果您试图更改该值,您将得到一个错误。虽然,阅读你的问题,因为文字是静态的,它可能适合你。就良好的编码实践而言,您可能希望使用

const struct sa*sap=&(struct sa){42,43,“x”}

或者,最好是

静态结构sax={42,43,“x”};

const struct sa*sap2=&x

您需要第二个示例(声明x,然后取addr)是否确定@bolov?对我来说,你不应该不能获取复合文字的地址,这一点并不明显。我需要研究一下。你是不是在问对a申请操作员地址是否合法?毕竟,他们的价值类别是左值,所以这应该得到支持。有趣的一点,我很高兴你们提出了它。但是根据我的答案链接中的标准草稿,如果复合文本标记为const(字符串文本成员可能始终是只读的),它将是只读的。Gcc同意,并且不会将复合文本放在只读内存中。