struct和struct成员的数组元素

问题描述 投票:5回答:3

我想问一下C中的结构声明。例如,

struct Person
{
    char name[50];
    int citNo;
    float salary;
} prsn[20];

[20]是做什么的?这是什么意思?是将名称限制为20(从50)还是将prsnprsn[1]限制为prsn[20]

如果我编写这样的代码:

struct Person
{
    char name[50];
    int citNo;
    float salary;
};
struct Person prsn[20];

它是否做同样的事情?

c struct
3个回答
4
投票

[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]intfloat

EDIT回答评论中的问题:

如果我想使元素不受限制,该怎么办?

如果要使用空数组括号([]),则定义必须包含struct initializer list。例如:

... } prsn[] = {{"Bill", 1, 23000.00}, {"John", 2, 45000.00}, ...};  

如果结构数组的大小在编译时未知,并且需要根据仅在运行时可用的信息来确定大小,则可以使用动态内存分配或VLA。首先,对于动态内存,而不是使用数组符号定义,请创建一个指针实例:

... } *prsn;  

然后,在函数中,使用callocmalloc创建用于说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关联的内存


8
投票

上面的两段代码是等效的。

在第一个中,您定义struct Person并将prsn定义为同时包含该结构的20个元素的数组。在第二个中,您首先定义结构,然后分别定义数组。

在C中,数组索引从0开始,因此在两种情况下prsn数组都包含从0到19索引的元素。这确实会[[not影响name成员的大小,该成员是50个元素数组。您有20个struct Person的数组,每个数组包含50个char的元素数组,称为name

关于使数组的大小不受限制,数组

必须的大小可以在[]之间显式指定,也可以通过初始化列表隐式指定。 size可以是一个变量,但是不能在文件范围内定义这样的数组,并且必须事先为size变量分配一个值。


0
投票
您正在声明该类型的20个结构的数组
© www.soinside.com 2019 - 2024. All rights reserved.