[英]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.