可以 initialize/assign 一个结构指针吗?
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
类型的正确方法是什么?
指针,除了空指针,需要指向存在的对象(可以是已分配但尚未填充的内存)。您可以定义一个指针并将其初始化为您同时创建的对象,使用复合文字:
CarPtr jeep = & (Car) { .name = "Jeep", .price = 40000 };
这是一种特殊的语法,类型名称在括号中,后跟包含初始值设定项的大括号,就像在定义中一样。 (这不是演员。)
您还可以将复合文字或其地址直接传递给函数:
print_struct(& (Car) { .name = "Jeep", .price = 40000 });
但是,这具有有限的用途,因为如果这是在函数内部完成的,则该对象是临时的;只要当前函数执行持续,它的生命周期就会持续。您可以在函数外部使用复合文字,然后它会持续整个程序执行过程。在使用复合文字之前,您应该对复合文字的属性有一个大概的了解和认识。
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
,因为复合字面量在这个上下文中有自动存储期限
假设我有以下结构和两个版本来初始化它:
#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
类型的正确方法是什么?
指针,除了空指针,需要指向存在的对象(可以是已分配但尚未填充的内存)。您可以定义一个指针并将其初始化为您同时创建的对象,使用复合文字:
CarPtr jeep = & (Car) { .name = "Jeep", .price = 40000 };
这是一种特殊的语法,类型名称在括号中,后跟包含初始值设定项的大括号,就像在定义中一样。 (这不是演员。)
您还可以将复合文字或其地址直接传递给函数:
print_struct(& (Car) { .name = "Jeep", .price = 40000 });
但是,这具有有限的用途,因为如果这是在函数内部完成的,则该对象是临时的;只要当前函数执行持续,它的生命周期就会持续。您可以在函数外部使用复合文字,然后它会持续整个程序执行过程。在使用复合文字之前,您应该对复合文字的属性有一个大概的了解和认识。
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
,因为复合字面量在这个上下文中有自动存储期限