【问题标题】:How to make a pointer struct member behave like an array?如何使指针结构成员表现得像数组?
【发布时间】:2021-05-23 09:27:43
【问题描述】:

我的结构中有一个指针。

typedef struct AnotherStructure
{
    int member1;
} AnotherStructure;

typedef struct Structure
{
    int member1;
    AnotherStructure* member2;
} Structure;

AnotherStructure x = {0};

该指针的行为不应像普通指针,而应像数组一样。现在我有了另一段代码,

Structure some_struct = {10, {&x, NULL /* Sentinel */}};

这不起作用。我知道为什么。这是因为它试图初始化一个指针但没有这样做,因为第一个元素既不是指针也不是地址,而且我们为它提供了多个初始化器。不过我也试过了,

AnotherStructure* array[] = {&x, NULL};
Structure some_struct = {10, array};

这也不起作用,因为有不同的间接方式(AnotherStructure**AnotherStructure*)。

现在我实际上无法更改主要结构。我能做的是为结构初始化提供不同的输入。有办法吗?

【问题讨论】:

  • 改用long array[] = {20, 30};。并希望数组的生命周期至少与结构的生命周期一样长。
  • 错误 C2099:初始化程序不是常量
  • 这就是它现在显示的内容
  • AnotherStructure* array[] = {&x, NULL}; / Structure some_struct = {10, array}; 不起作用是因为类型错误,而不是因为初始化程序必须是常量。如果您希望membe2 成为指向AnotherStructure 的指针,则必须使用指向AnotherStructure 的指针来初始化它,而不是使用指向AnotherStructure 的指针。展示您要创建的实际结构的真实示例。
  • @EricPostpischil 很抱歉造成混淆,这是对某个程序员老兄的回复。我的实际错误是你描述的那个

标签: c visual-c++ c99


【解决方案1】:

您可以使用复合文字:

Structure some_struct = {10, (AnotherStructure []) { {20}, {30} }};

还有:

AnotherStructure x[] = { {20}, {30} };
Structure some_struct = {10, x};

语法(<i>type</i>) { <i>list of initial values</i> } 创建一个对象。在上面的例子中,它创建了一个AnotherStructure 的数组,并且该数组被自动转换为一个指针,它适合于初始化member2 成员。 (由于数组的每个元素都是一个结构体,所以结构体内部成员的初始值用大括号括起来。)

当在任何函数之外使用时,对象将是静态的;它的生命周期将持续程序执行的持续时间。在函数内部,它将具有自动存储持续时间。它的生命周期将在其关联块的执行结束时结束。

【讨论】:

  • 可以编辑您的帖子以相应地回答编辑后的问题。
  • @ShreyanAvigyan:我已经编辑过了,但您应该知道,以使现有答案不正确的方式编辑 Stack Overflow 问题通常是不合适的。
  • 好的。而且您还在这里创建了一个 RHS 值。这可以使用现有的 LHS 值吗?
  • Structure some_struct = {10, (AnotherStructure []) { {20}, {30} }}; 如果some_struct 具有静态存储持续时间,则它不可移植,因为它是 GCC 扩展。
  • @0___________:这是严格符合 C 代码的;它不使用 GCC 扩展。
【解决方案2】:

你可以这样做:

long x = 20, y = 30;
long array[] = {x, y};
Structure some_struct = {10, array};

您只需要确保some_struct.member2array 的生命周期结束后(即在array 超出范围之后)没有被取消引用。

【讨论】:

  • 这里的问题是我无法显示我的真实代码。这是一个虚拟代码。我将编辑问题以使其更加清晰。
  • 可以编辑您的帖子以相应地回答编辑后的问题。
猜你喜欢
  • 1970-01-01
  • 2020-05-02
  • 2023-03-15
  • 2020-05-06
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多