如何初始化指向结构的指针数组?

Posted

技术标签:

【中文标题】如何初始化指向结构的指针数组?【英文标题】:How can I initialize an array of pointers to structs? 【发布时间】:2010-09-16 17:27:11 【问题描述】:

是否可以初始化指向结构的指针数组? 比如:

struct country_t *countries[] = 
        "United States of America", "America",
        "England", "Europe",
        "Ethiopia", "Africa"  
    

我想这样做是为了将实体放在不连续的内存中,并将指向它们的指针放在连续的内存中......但我不能使用动态内存,所以我想知道没有它是否有可能。

【问题讨论】:

为什么要指向结构体? 【参考方案1】:

好吧,您的代码使用结构而不是指向结构的指针。有多种方法可以满足您的需求,包括:

static struct country_t us =  "United States of America", "America" ;
static struct country_t uk =  "England",                  "Europe"  ;
static struct country_t et =  "Ethiopia",                 "Africa"  ;

struct country_t *countries[] =  &us, &uk, &et, ;

在 C99 中还有其他方法可以使用指定的初始值设定项和复合文字。第 6.5.2.5 节“复合文字”显示了方法:

struct country_t *countries[] =

    &(struct country_t)  "United States of America", "America" ,
    &(struct country_t)  "England",                  "Europe"  ,
    &(struct country_t)  "Ethiopia",                 "Africa"  ,
;

该标准通过函数调用说明了指向结构的指针。请注意,并非所有 C 编译器都接受 C99 语法,并且这些复合文字在 C89(又名 C90)中不存在。

编辑:已升级为使用 2 个字母的 ISO 3166 国家/地区代码。还将命名结构变成静态变量——这些符号之前在文件之外不可见(因为它们不存在),现在它们在文件之外也不可见。我争论过是否做任何事情 const 并决定不做——但在可能的情况下使用 const 通常是一个好主意。此外,在示例中,有 3 个大洲的 3 个国家/地区。如果您在一个大陆上有多个国家(标准),您可能希望能够共享大陆字符串。但是,您是否可以安全地(或完全)做到这一点取决于struct country_t 的详细信息(未给出),以及是否允许程序更新表(这又回到了 const-ness 问题)。

【讨论】:

在您的第一个示例中,您应该将所有结构标记为static:它们不需要在当前编译单元之外可见,并且现在正在弄乱链接命名空间。 同意 - 我决定不让这个细节复杂化答案,尽管我为自己的工作编写解决方案,所有可能是静态的(在文件外不可见)都会是。【参考方案2】:

这对我有用:


struct country_t 
    char *fullname;
    char *shortname;
;

struct country_t countries[] = 
        "United States of America", "America",
        "England", "Europe",
        "Ethiopia", "Africa"
;

int main(int argc, char *argv[])

    return 0;

你可以更简洁并使用:


struct country_t 
    char *fullname;
    char *shortname;
 countries[] = 
        "United States of America", "America",
        "England", "Europe",
        "Ethiopia", "Africa"
;

int main(int argc, char *argv[])

    return 0;

编辑:我在The C Book找到了这个信息

【讨论】:

这个问题要求一个指向结构的指针数组,这意味着你的答案没有抓住重点,不是吗? 另外,EuropeEngland 的简称吗?不,哇! :-)

以上是关于如何初始化指向结构的指针数组?的主要内容,如果未能解决你的问题,请参考以下文章

在C ++中初始化一个指向结构的指针数组

从指向结构数组的指针中提取元素

c语言如何输出指针所指向的ŀ

C++结构体指针数组如何分配空间,用new

C#如何调用C++的DLL的结构体数组指针

C++入门基础教程:C语言的指针与结构体到底怎么用?