【问题标题】:How to declare string in C structs?如何在 C 结构中声明字符串?
【发布时间】:2021-03-14 19:58:23
【问题描述】:

我刚开始使用结构,遇到了这个问题,它给了我以下我不知道如何解决的错误:

类型为 'char []' 的灵活数组成员 'name' 不在末尾 结构体

我发现将字符设置为指针或给它们一个大小可以修复错误,但我不确定我做的是否正确。

struct car{
    char company[];
    char model[];
    int price;
    int hp;
    char fuel_type[];
    char color[];
};

上述方法不起作用,但这样做:

struct car{
    char company[20];
    char model[20];
    int price;
    int hp;
    char fuel_type[20];
    char color[20];
};

指针也一样。那么,我应该使用什么以及如何解决这个问题?

【问题讨论】:

  • 你不能修复第一个:只有一个灵活数组可能在struct因为它必须是最后一个成员。

标签: c string struct


【解决方案1】:

struct 中只有一个成员(last 成员)可以是不完整的数组类型(未指定大小的数组,aka“灵活数组” )。这是因为,如果存在其他此类成员,它们在编译时大小未知,编译器将无法确定从结构开始到在此类成员之后出现的任何成员所需的偏移量.

这是(Draft) C11 Standard 要说的话:

6.7.2.1 结构和联合说明符

...
18     作为一种特殊情况,结构的最后一个元素具有多个命名 成员可能具有不完整的数组类型;这被称为灵活 数组成员。在大多数情况下,灵活的数组成员是 忽略。特别是,结构的大小就像 灵活的数组成员被省略了,除了它可能有更多 比遗漏所暗示的尾随填充。然而,当一个 . (或者 ->) 运算符的左操作数是(指向)具有灵活数组成员的结构,右操作数命名该成员, 它的行为就像该成员被最长的数组替换 (具有相同的元素类型)不会使结构变大 比被访问的对象;数组的偏移量应保持 灵活数组成员的那个,即使这与那个不同 的替换阵列。如果这个数组没有元素,它 表现得好像它只有一个元素,但如果有的话,行为是未定义的 尝试访问该元素或生成指针 one 过去了。

另外请注意,具有这种灵活数组成员的结构不能显示为数组元素或其他结构的(嵌套)成员。

【讨论】:

    【解决方案2】:

    对于像 name[] 这样的数组,您必须立即在 C 中为其分配数据,否则它将不起作用, 喜欢

    int arr[]={2,4,5};
    

    在结构中使用数组使用指针并动态分配它们或使用具有固定大小的数组,例如

    char *arr;
    char arr[20];
    

    【讨论】:

      【解决方案3】:

      你需要一个固定的数组大小。

      作为替代,您可以使用指针,如“char *strString”,但您需要在运行时分配 malloc 或 calloc 内存大小(字符串大小)。在这种情况下,字符串的大小可以是灵活的。

          #define BUF 255
         char *str = NULL;
         char Buffer[BUF];
      
         printf("String? ");
         fgets(Buffer, BUF, stdin);
         str = malloc(strlen(Buffer)+1);
         if(NULL == str) {
            printf("No memory");
            return EXIT_FAILURE;
         }
         strcpy(str, Buffer);
         free(str);
      

      【讨论】:

      • 我认为puffer 是一个错字。
      猜你喜欢
      • 2018-02-16
      • 2010-11-28
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多