簡體   English   中英

struct 和 struct 成員的數組元素

[英]Array elements of struct and struct members

我想問一下 C 中的 struct 聲明。例如,

struct Person
{
    char name[50];
    int citNo;
    float salary;
} prsn[20];

[20]什么作用? 這是什么意思? 它是否將名稱限制為 20(從 50)或將prsnprsn[1]prsn[20]

如果我寫這樣的代碼:

struct Person
{
    char name[50];
    int citNo;
    float salary;
};
struct Person prsn[20];

它做同樣的事情嗎?

上面兩段代碼是等價的。

在第一個中,您定義struct Person並將prsn定義為同時包含該結構的 20 個元素的數組。 在第二個中,您首先定義結構然后單獨定義數組。

在C中,數組索引從0開始,因此在兩種情況下, prsn數組包含索引為0〜19這並不影響的大小的元素name構件,這是一個50元件陣列。 您有一個由 20 個struct Person的數組,每個struct Person都包含一個 50 個元素的char數組,稱為name

關於使數組大小不受限制,數組必須有一個大小,在[]之間顯式指定或通過初始化列表隱式指定。 size 可以是一個變量,但是這樣的數組不能在文件范圍內定義,並且 size 變量必須之前已經賦值。

[20] 有什么作用? 這是什么意思?

下面的注釋顯示了 struct 各部分的常用命名法

struct Person {    //struct name (Person)
    char name[50]; // \
    int citNo;     //  --struct members 
    float salary;  // /
} prsn[20];        // instance of struct Person array

[20]表示struct Person這個實例是一個包含 3 個成員的 20 個單獨集合的數組。 可以使用數組表示法訪問數組的每個元素。 例如,在一個循環中:

int main(int argc, char *argv[])
{
    for(int i=0;i<20;i++)// note i goes from 0 to 19
    {
        //.....
        //assuming members have been populated
        printf( "%d)\nName is: %d\ncitNo is: %d salary is: %f\n\n", prsn[i].name, prsn[i].citNo, prsn[i].salary);
    }

    return 0;
}

[20] 是否將名稱限制為 20(從 50)或將prsnprsn[1]prsn[20]

成員name[50]定義了一個 50 個字符的數組。 它的大小不受用於調整結構數組大小的[20]索引的任何影響。 即正如您定義的那樣,有 20 個prsn實例,每個實例包含 3 個成員: char [50]intfloat 根據您的定義, [20]創建的 20 個實例允許使用從019索引值訪問數組。 (參見上面的循環圖。)

編輯以解決評論中的 OP 問題:

如果我想讓元素不受限制,我必須做什么?

如果要使用空數組括號 ( [] ),則定義必須包含一個struct 初始值設定項列表 例如:

... } prsn[] = {{"Bill", 1, 23000.00}, {"John", 2, 45000.00}, ...};  

如果 struct 數組的大小在編譯時未知,並且需要根據僅在運行時可用的信息來確定大小,則可以使用動態內存分配或VLA 首先,對於動態內存,不是用數組表示法定義,而是創建一個指針實例:

... } *prsn;  

然后,在函數中,使用callocmalloc為 1000 個實例創建內存:

int someFunction(void)
{
    prsn = calloc(1000, sizeof(struct Person));
    if(prsn)
    {
        // Use instances of prsn
        // free when finished
        free(prsn);
    }

對於 VLA,創建的實例必須具有本地范圍。 因此,在某處的函數內,執行以下操作:

int someFunction(int sizeOfStruct)
{
    struct Person newPerson[sizeOfStruct] = {0};

請注意,此方法不需要釋放與newPerson關聯的內存

您正在聲明該類型的 20 個結構的數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM