簡體   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