[20] 是做什么的?这是什么意思?
下面的cmets显示common nomenclature for the parts of your 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 的索引值访问数组。 (参见上面的循环图。)
编辑以解决 cmets 中的 OP 问题:
如果我想让元素不受限制,我该怎么办?
如果您想使用空数组括号,([])定义必须包含struct initializer list。例如:
... } prsn[] = {{"Bill", 1, 23000.00}, {"John", 2, 45000.00}, ...};
如果结构数组的大小在编译时未知,并且需要根据仅在运行时可用的信息来调整大小,则可以使用动态内存分配或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相关的内存