我正在尝试掌握结构数组的概念,并提出了一个问题。希望你能帮助我。
好的,那么,我面临的问题是如何在结构数组中声明和使用(即接受和显示值)数组变量?
此示例代码可以直观地帮助您理解我的问题:
#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];
这到底发生了什么?你如何解决我上面提到的问题?
答案 0 :(得分:2)
您引用的示例中有一个额外的*
。仅需要malloc
,在您的示例中,inputs
是指向char
的10个指针的数组,而此处name
是一个缓存10 char
的缓冲区秒。您的代码中不需要任何malloc
。
你的结构在内存中看起来像这样(假设有4个字节int
s):
来自student
的{{1}}数组如下:
如你所见,田地一个接一个地布置。因此,要读取您必须写入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
不是必需的(您也可以指定40
或50
来满足您的要求)。
你唯一应该保证的是数组中的每个元素都是一个地址(这就是malloc
返回的内容)。
10
指定数组维度,即您可以在10
中总共存储inputs
个地址,或者说,您可以通过调用malloc
十次来初始化数组,如:
struct a;
for (int i = 0; i < 10; i++) {
a.inputs[i] = (char *) malloc(25);
}
回到你自己的问题。
在您的情况下,符号name
标识存储的地址。
您无需使用malloc新存储。