我想问一下C中的结构声明。例如,
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];
它是否做同样的事情?
[20]是做什么的?这是什么意思?
struct Person
{
char name[50];
int citNo;
float salary;
} prsn[20];
[20]
表示内存专用于prsn
的20个实例。
它定义了要使用数组表示法访问的结构的3个成员的20个单独的集合。例如,在循环中:
int main(int argc, char *argv[])
{
for(int i=0;i<20;i++)
{
//.....
//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]
索引的任何影响。即,按照您的定义,有prsn
的20个实例,每个实例包含3个成员:char [50]
,int
和float
。
EDIT回答评论中的问题:
如果我想使元素不受限制,该怎么办?
如果要使用空数组括号([]
),则定义必须包含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
关联的内存
上面的两段代码是等效的。
在第一个中,您定义struct Person
并将prsn
定义为同时包含该结构的20个元素的数组。在第二个中,您首先定义结构,然后分别定义数组。
在C中,数组索引从0开始,因此在两种情况下prsn
数组都包含从0到19索引的元素。这确实会[[not影响name
成员的大小,该成员是50个元素数组。您有20个struct Person
的数组,每个数组包含50个char
的元素数组,称为name
。
必须的大小可以在[
和]
之间显式指定,也可以通过初始化列表隐式指定。 size可以是一个变量,但是不能在文件范围内定义这样的数组,并且必须事先为size变量分配一个值。