如何在结构数组中使用数组变量?

时间:2013-08-11 13:51:58

标签: c struct malloc

我正在尝试掌握结构数组的概念,并提出了一个问题。希望你能帮助我。

好的,那么,我面临的问题是如何在结构数组中声明和使用(即接受和显示值)数组变量?

此示例代码可以直观地帮助您理解我的问题:

#include<stdio.h>

struct node{

    int roll;
    char name[10];
    int grades[5]; // Accepts 5 grades for each student
};

int main()
{
    struct node student[3];

    /*Accept and display values for structure members here*/

    return 0;
}

我知道有一个类似的例子here

但我不理解接受的答案的main()部分中的第4行,其中使用malloc()分配内存:

list[ip].inputs[inp]= (char*)malloc(25);

我在这里分配的25个字节和char* inputs[10];

中定义的10个字节之间感到困惑

这到底发生了什么?你如何解决我上面提到的问题?

3 个答案:

答案 0 :(得分:2)

您引用的示例中有一个额外的*。仅需要malloc,在您的示例中,inputs是指向char的10个指针的数组,而此处name是一个缓存10 char的缓冲区秒。您的代码中不需要任何malloc

你的结构在内存中看起来像这样(假设有4个字节int s):

enter image description here

来自student的{​​{1}}数组如下:

enter image description here

如你所见,田地一个接一个地布置。因此,要读取您必须写入main的第一个学生的姓名(使用student[0].name以确保没有溢出)。要更改第二个学生姓名的第三个字母,请使用strncpy

答案 1 :(得分:1)

您可以安全地使用它:

strcpy(student[1].name, "Yu Hao");
student[1].grades[1] = 95;

printf("student 1 name: %s\n", student[1].name);
printf("student1 grades1:%d\n", student[1].grades[1]);

您链接的示例使用malloc,因为struct有一些指针,指针必须在使用之前指向某个有效位置。在你的例子中并非如此。

请注意,复制超过10的字符串时,使用strcpy会导致灾难,如果需要考虑,请改用strncpy

答案 2 :(得分:0)

回答与推荐职位有关的问题。

首先,希望您对C语言中的指针有基本了解。 指针确实是一个简短的内存地址。 有关详细信息,我建议您this小册子(关于数组和poiners的非常出色的介绍)。 在该段代码中,inputs被定义为char* inputs[10];。 这是一个指针数组。 所以该数组中的每个元素都应该是一个地址。 25调用中的参数malloc不是必需的(您也可以指定4050来满足您的要求)。 你唯一应该保证的是数组中的每个元素都是一个地址(这就是malloc返回的内容)。 10指定数组维度,即您可以在10中总共存储inputs个地址,或者说,您可以通过调用malloc十次来初始化数组,如:

struct a;
for (int i = 0; i < 10; i++) {
    a.inputs[i] = (char *) malloc(25);
}

回到你自己的问题。 在您的情况下,符号name标识存储的地址。 您无需使用malloc新存储。