在C中初始化大小的静态字符串列表

时间:2014-10-20 01:03:32

标签: c string struct static initialization

我想创建具有可发现大小的字符串列表,并且不确定我是否拥有正确的方法/语法。这是我的尝试:

  typedef struct {
       unsigned int size;
       char** list;
  } STRLIST;

  static STRLIST listMediaType = {
      .size = 7,
      .list = {
          "Book",
          "Map",
          "Booklet",
          "Pamphlet",
          "Magazine",
          "Report",
          "Journal"
      },
  };

这是正确的做法吗?请注意,我不想将大小硬编码到结构中,因为我想使用相同的类型来定义许多不同的列表。例如,想象一下以下函数:

void printList( STRLIST* pList ){
   for( int x = 0; x < pList->size; x++ ) printf( "%s\n", pList->list );
}

2 个答案:

答案 0 :(得分:3)

可以使用C99复合文字和稍微改变来完成:
http://coliru.stacked-crooked.com/a/4497d2645ad21b74

typedef struct STRLIST{
    unsigned int size;
    char** list;
} STRLIST;

static STRLIST listMediaType = {
    .size = 7,
    .list = (char*[]){
        "Book",
        "Map",
        "Booklet",
        "Pamphlet",
        "Magazine",
        "Report",
        "Journal"
    },
};

C90的替代品(因此没有复合文字和指定的初始化者):http://coliru.stacked-crooked.com/a/5cc95d25afc18c91

static char* list[] = {
    "Book",
    "Map",
    "Booklet",
    "Pamphlet",
    "Magazine",
    "Report",
    "Journal"
};
static STRLIST listMediaType = {
    sizeof list / sizeof *list,
    // Used sizeof to avoid manually typing the lists length
    list,
};

顺便说一句,带有标记的数组 - NULL远比计数数组简单。
甚至不需要新的类型。

static char* list[] = {
    "Book",
    "Map",
    "Booklet",
    "Pamphlet",
    "Magazine",
    "Report",
    "Journal",
    0
};
void printList(char** pList){
   while(*pList) printf( "%s\n", *pList++);
}

答案 1 :(得分:1)

您可以查看此代码:

#include <stdio.h>

typedef struct {
    unsigned int size;
    char* list[];

} STRLIST;

static STRLIST listMediaType = {
    7, 
    {
        "Book",
        "Map",
        "Booklet",
        "Pamphlet",
        "Magazine",
        "Report",
        "Journal"
    }
};

int main() {
    printf("struct size: %d\n", listMediaType.size);
    int i;
    for (i = 0; i < listMediaType.size; i++) 
        printf("struct elem[%d] = \"%s\"\n", 
                i, 
                listMediaType.list[i]);

    return 0;
}

我认为您的方法存在两个问题:

  1. C中的TYPEDEF句法是否正确?我认为你应该用小写字母写。
  2. 如果要初始化结构,只需使用大括号而不使用.attributes
  3. 希望这个会有所帮助。

    由于