【问题标题】:Possible to initialize/assign a struct pointer?可以初始化/分配结构指针吗?
【发布时间】:2021-04-12 16:18:33
【问题描述】:

假设我有以下结构和两个版本来初始化它:

#include <stdio.h>

typedef struct Car *CarPtr;
typedef struct Car {
        const char*     name;
        unsigned int    price;
} Car;

int main(void) {

    Car ford = {
        .name = "Ford F-150",
        .price = 25000
    };
    print_struct(&ford);

    // is this possible to do in a single assignment?
    CarPtr jeep = {
        .name = "Jeep",
        .price = 40000
    };
    print_struct(jeep);

}

第二个版本可以直接做吗?还是我需要按照以下方式做一些事情:

CarPtr jeep;
jeep->name = "Jeep";
jeep->price = 40000;

或者直接初始化CarPtr类型的正确方法是什么?

【问题讨论】:

  • 指针需要先分配才能初始化/分配指针
  • @AdnanAhmed new 是 C++。这被标记为 C
  • @Heal 抱歉,我忽略了这一点。该评论已被编辑。
  • 由于它是一个指针,因此您必须将 malloc 用于 CarPtr,而且您没有在代码的最后一个示例中将任何 Car 类型变量的地址分配给 CarPtr,并且使用了使用 malloc 的 Car_new 等构造函数建议用于初始化。

标签: c struct initialization list-initialization compound-literals


【解决方案1】:

除空指针外,指针需要指向存在的对象(可以是已分配但尚未填充的内存)。您可以使用复合文字定义一个指针并将其初始化为您同时创建的对象:

CarPtr jeep = & (Car) { .name = "Jeep", .price = 40000 };

这是一种特殊的语法,括号中的类型名称后跟包含初始化器的大括号,就像在定义中一样。 (这不是演员表。)

您也可以将复合文字或其地址直接传递给函数:

print_struct(& (Car) { .name = "Jeep", .price = 40000 });

然而,this 的用途有限,因为如果这是在函数内部完成的,则对象是临时的;它的生命周期仅与当前函数执行持续时间一样长。您可以在函数外部使用复合文字,然后它会持续到所有程序执行。在使用复合字面量之前,您应该对它们的属性有一个大致的了解和认识。

【讨论】:

  • 我明白了——谢谢!我试图直接做&amp;{ .name = "Jeep", .price = 40000},但我认为我需要明确地说该结构是Car才能工作。
【解决方案2】:

CarPtr 是一个指针(标量对象),它可以由只包含一个表达式的花括号列表初始化。

所以这个初始化

CarPtr jeep = {
    .name = "Jeep",
    .price = 40000
};

不正确。

类似于您尝试通过以下方式使用复合文字来实现的外观。

#include <stdio.h>

typedef struct Car *CarPtr;
typedef struct Car {
        const char*     name;
        unsigned int    price;
} Car;

int main( void )
{
    CarPtr jeep = &( Car ){ .name = "Jeep", .price = 40000 };
    
    printf( "%s - %u\n", jeep->name, jeep->price );
}

程序输出是

Jeep - 40000

注意不要使用标准函数free释放指向的对象,因为复合字面量在这种情况下具有自动存储持续时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多