繁体   English   中英

struct 和 struct 成员的数组元素

[英]Array elements of struct and struct members

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

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];

它做同样的事情吗?

上面两段代码是等价的。

在第一个中,您定义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)或将prsnprsn[1]prsn[20]

成员name[50]定义了一个 50 个字符的数组。 它的大小不受用于调整结构数组大小的[20]索引的任何影响。 即正如您定义的那样,有 20 个prsn实例,每个实例包含 3 个成员: char [50]intfloat 根据您的定义, [20]创建的 20 个实例允许使用从019索引值访问数组。 (参见上面的循环图。)

编辑以解决评论中的 OP 问题:

如果我想让元素不受限制,我必须做什么?

如果要使用空数组括号 ( [] ),则定义必须包含一个struct 初始值设定项列表 例如:

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

如果 struct 数组的大小在编译时未知,并且需要根据仅在运行时可用的信息来确定大小,则可以使用动态内存分配或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关联的内存

您正在声明该类型的 20 个结构的数组

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM