繁体   English   中英

如何在 C 结构中声明字符串?

[英]How to declare string in C structs?

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

类型为 '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中只有一个成员(最后一个成员)可以是不完整的数组类型(具有未指定大小的数组,也称为“灵活数组”)。 这是因为,如果存在其他此类成员,它们在编译时大小未知,编译器无法确定从结构开始到出现此类成员之后的任何成员所需的偏移量。

以下是这个(草案)C11 标准的内容:

6.7.2.1 结构和联合说明符

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

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

对于 Arrays 之类的名称 [],您必须立即在 C 中为其分配数据,否则它将不起作用,例如

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

在结构中使用 arrays 使用指针并动态分配它们或使用具有固定大小的 arrays

char *arr;
char arr[20];

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM