簡體   English   中英

可以初始化/分配結構指針嗎?

[英]Possible to initialize/assign a struct pointer?

假設我有以下結構和兩個版本來初始化它:

#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類型的正確方法是什么?

指針,除了 null 指針之外,需要指向存在的對象(可以是已分配但尚未填充的 memory)。 您可以使用復合文字定義一個指針並將其初始化為您同時創建的 object:

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

這是一種特殊的語法,括號中的類型名稱后跟包含初始化器的大括號,就像在定義中一樣。 (這不是演員表。)

您還可以將復合文字或其地址直接傳遞給 function:

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

但是,它的用途有限,因為如果這是在 function 內部完成的,則 object 是臨時的; 它的生命周期僅與當前 function 執行持續時間一樣長。 您可以在 function 之外使用復合文字,然后它會持續到所有程序執行。 在使用復合文字之前,您應該對它們的屬性有一個大致的了解和認識。

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 );
}

程序 output 是

Jeep - 40000

請注意,您不應使用標准 function free來釋放指向的 object,因為在這種情況下復合文字具有自動存儲持續時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM