代码之家  ›  专栏  ›  技术社区  ›  David542

是否可以初始化/分配结构指针?

  •  1
  • David542  · 技术社区  · 4 年前

    #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 直接键入?

    2 回复  |  直到 4 年前
        1
  •  2
  •   Eric Postpischil    4 年前

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

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

    这是一种特殊的语法,类型名在括号中,后跟大括号,括号中包含初始值设定项,就像在定义中一样。(这不是演员阵容。)

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

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

    但是,这有有限的用途,因为如果这是在函数内部完成的,那么对象是临时的;它的生命周期只会持续到当前函数执行的时间。您可以在函数外使用复合文字,然后它将持续整个程序执行。在使用复合文字之前,您应该对其性质有一个大致的了解和认识。

        2
  •  1
  •   Vlad from Moscow    4 年前

    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 因为复合文本在此上下文中具有自动存储持续时间。

    推荐文章