gpt4 book ai didi

c - 结构初始化期间的静态数组初始值设定项

转载 作者:行者123 更新时间:2023-11-30 15:45:43 26 4
gpt4 key购买 nike

这是我拥有的两个结构的简化版本:

struct MyStruct1 {
double d;
}

struct MyStruct2 {
struct MyStruct1* a;
int i;
}

我可以按如下方式初始化第二个结构:

void InitStruct(struct MyStruct2 pMyStruct2) {
static struct MyStruct1 A[] = { {.d=12} , {.d=17} , {.d=1} };
*pMyStruct2 = (struct MyStruct2) { .a = A, .i = 3 };
}

但实际上我必须以这种方式初始化它(因为这个结构又是一个应立即初始化的更大结构的一部分):

void InitStruct(struct MyStruct2 pMyStruct2) {
*pMyStruct2 = (struct MyStruct2) {
.a = (struct MyStruct1[]) {
{.d=12} , {.d=17} , {.d=1}},
.i=3 };
}

两种方法都可以在没有任何警告的情况下进行编译但是第二种解决方案中的数据会损坏。

我认为内部数组不是静态的,因此 .a 指针立即无效。

还有其他方法告诉编译器将数组的数据保留在内存中吗?

最佳答案

C99 standard §6.5.2.5 p6 说:

The value of the compound literal is that of an unnamed object initialized by the initializer list. If the compound literal occurs outside the body of a function, the object has static storage duration; otherwise, it has automatic storage duration associated with the enclosing block.

在这两种情况下,变量都应该正确初始化并且在它们声明的范围内使用有效。

但是,如果您按值从函数返回结构,则指针将变得无效。

这是我用于测试的示例代码。 Valgrind 显示没有错误。

#include <stdio.h>

struct MyStruct1 {
double d;
};

struct MyStruct2 {
struct MyStruct1* a;
int i;
};

struct MyStruct1 A[] = { {.d=12} , {.d=17} , {.d=1} };
struct MyStruct2 b1 = { .a = A, .i = 3 };

struct MyStruct2 b2 = { .a = (struct MyStruct1[]) {
{.d=12} , {.d=17} , {.d=1}
},
.i=3 };



int main( void ) {
struct MyStruct1 B[] = { {.d=12} , {.d=17} , {.d=1} };
struct MyStruct2 b3 = { .a = B, .i = 3 };

struct MyStruct2 b4 = { .a = (struct MyStruct1[]) {
{.d=12} , {.d=17} , {.d=1}
},
.i=3 };

printf("b1->a.d=%1.2f\n", b1.a->d);
printf("b2->a.d=%1.2f\n", b2.a->d);

printf("b3->a.d=%1.2f\n", b3.a->d);
printf("b4->a.d=%1.2f\n", b4.a->d);

}

关于c - 结构初始化期间的静态数组初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18867167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com