struct 和 struct 成员的数组元素

wir*_*dev 8 c struct

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

struct Person
{
    char name[50];
    int citNo;
    float salary;
} prsn[20];
Run Code Online (Sandbox Code Playgroud)

有什么作用[20]?这是什么意思?是将名称限制为 20(从 50)还是将prsnfrom限制prsn[1]prsn[20]

如果我写这样的代码:

struct Person
{
    char name[50];
    int citNo;
    float salary;
};
struct Person prsn[20];
Run Code Online (Sandbox Code Playgroud)

它做同样的事情吗?

dbu*_*ush 9

上面两段代码是等价的。

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

在C中,数组索引从0开始,因此在两种情况下,prsn数组包含索引为0〜19这并元素影响的大小name构件,这是一个50元件阵列。您有一个 20 的数组struct Person,每个数组包含一个 50 个元素的char调用数组name

关于使数组大小无限制,阵列必须具有的尺寸,无论之间明确指定[]或隐式地通过一个初始化列表。size 可以是一个变量,但是这样的数组不能在文件范围内定义,并且 size 变量必须之前已经赋值。

  • @abw1904 数组 *必须* 有一个大小,可以在 `[` 和 `]` 之间显式指定,也可以通过初始化列表隐式指定。大小可以是一个变量,但是这样的数组不能在文件范围内定义,并且大小变量必须事先已分配一个值。 (2认同)

ryy*_*ker 8

[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)还是将prsnfrom限制prsn[1]prsn[20]

该成员name[50]定义了一个 50 个字符的数组。它的大小不受[20]用于调整结构数组大小的索引的任何影响。即正如您定义的那样,有 20 个实例prsn,每个实例包含 3 个成员: char [50]intfloat。根据您的定义, 由 创建的 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)

然后,在函数中,使用callocmalloc为 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