我想问一下 C 中的 struct 声明。例如,
struct Person
{
char name[50];
int citNo;
float salary;
} prsn[20];
Run Code Online (Sandbox Code Playgroud)
有什么作用[20]
?这是什么意思?是将名称限制为 20(从 50)还是将prsn
from限制prsn[1]
为prsn[20]
?
如果我写这样的代码:
struct Person
{
char name[50];
int citNo;
float salary;
};
struct Person prsn[20];
Run Code Online (Sandbox Code Playgroud)
它做同样的事情吗?
上面两段代码是等价的。
在第一个中,您同时定义struct Person
并定义prsn
为该结构的 20 个元素的数组。在第二个中,您首先定义结构然后单独定义数组。
在C中,数组索引从0开始,因此在两种情况下,prsn
数组包含索引为0〜19这并元素不影响的大小name
构件,这是一个50元件阵列。您有一个 20 的数组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
Run Code Online (Sandbox Code Playgroud)
的[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;
}
Run Code Online (Sandbox Code Playgroud)
[20] 将名称限制为 20(从 50)还是将
prsn
from限制prsn[1]
为prsn[20]
?
该成员name[50]
定义了一个 50 个字符的数组。它的大小不受[20]
用于调整结构数组大小的索引的任何影响。即正如您定义的那样,有 20 个实例prsn
,每个实例包含 3 个成员: char [50]
、int
和float
。根据您的定义, 由 创建的 20 个实例[20]
允许使用从0
到 的索引值访问数组19
。(参见上面的循环图。)
编辑以解决评论中的 OP 问题:
如果我想让元素不受限制,我必须做什么?
如果要使用空数组括号, ( []
) 定义必须包含一个结构体初始化列表。例如:
... } prsn[] = {{"Bill", 1, 23000.00}, {"John", 2, 45000.00}, ...};
Run Code Online (Sandbox Code Playgroud)
如果 struct 数组的大小在编译时未知,并且需要根据仅在运行时可用的信息来确定大小,则可以使用动态内存分配或VLA。首先,对于动态内存,不是用数组表示法定义,而是创建一个指针实例:
... } *prsn;
Run Code Online (Sandbox Code Playgroud)
然后,在函数中,使用calloc
或malloc
为 1000 个实例创建内存:
int someFunction(void)
{
prsn = calloc(1000, sizeof(struct Person));
if(prsn)
{
// Use instances of prsn
// free when finished
free(prsn);
}
Run Code Online (Sandbox Code Playgroud)
对于 VLA,创建的实例必须具有本地范围。因此,在某处的函数内,执行以下操作:
int someFunction(int sizeOfStruct)
{
struct Person newPerson[sizeOfStruct] = {0};
Run Code Online (Sandbox Code Playgroud)
请注意,此方法不需要释放与 newPerson