[英]Array elements of struct and struct members
我想問一下 C 中的 struct 聲明。例如,
struct Person
{
char name[50];
int citNo;
float salary;
} prsn[20];
[20]
什么作用? 這是什么意思? 它是否將名稱限制為 20(從 50)或將prsn
從prsn[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)或將
prsn
從prsn[1]
為prsn[20]
?
成員name[50]
定義了一個 50 個字符的數組。 它的大小不受用於調整結構數組大小的[20]
索引的任何影響。 即正如您定義的那樣,有 20 個prsn
實例,每個實例包含 3 個成員: char [50]
、 int
和float
。 根據您的定義, [20]
創建的 20 個實例允許使用從0
到19
索引值訪問數組。 (參見上面的循環圖。)
編輯以解決評論中的 OP 問題:
如果我想讓元素不受限制,我必須做什么?
如果要使用空數組括號 ( []
),則定義必須包含一個struct 初始值設定項列表。 例如:
... } prsn[] = {{"Bill", 1, 23000.00}, {"John", 2, 45000.00}, ...};
如果 struct 數組的大小在編譯時未知,並且需要根據僅在運行時可用的信息來確定大小,則可以使用動態內存分配或VLA 。 首先,對於動態內存,不是用數組表示法定義,而是創建一個指針實例:
... } *prsn;
然后,在函數中,使用calloc
或malloc
為 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.