朋友们,我正在尝试将整个结构复制到另一个结构中。当我编译时,我没有得到错误....当我打印显示一些垃圾价值....请指导我...谢谢!
在两个不同的功能中,我正在尝试添加值并打印它。我的第一个功能是“read_list”......在这里我得到了学生的名字和从用户插入的标记。
我的第二个功能是“print_list”,使用此功能我正在打印学生的详细信息。
请指导我一个教程,在那里我可以找到一些使用C语言结构的非常有趣的例子
#include<stdio.h>
typedef struct _student
{
char name[50];
unsigned int mark;
} student;
void print_list(student list[], int size);
void read_list(student list[], int size);
int main(void)
{
const int size = 3;
student list_first[size]; //first structre
student list_second[size]; //second structre of same type
read_list(list_first, size); //list_first structer fills with values
print_list(list_first, size); //to check i have printed it here
//Now as i knew that my first struct is filled with data .....so now i wanted to copy it
list_second[size] = list_first[size]; //cpoid from one struct to another
printf("Second list is copied from another struct: \n");
print_list(list_second, size); //Tried to print it here ....
system("pause");
return 0;
}
void read_list(student list[], int size)
{
unsigned int i;
printf("Please enter the info:\n");
for(i = 0; i<size; i++)
{
printf("\nname: ");
scanf("%s",&list[i].name);
printf("\nMark: ");
scanf("%d",&list[i].mark);
}
}
void print_list(student list[], int size)
{
unsigned int i;
for(i=0; i<size; i++)
{
printf("Name: %s\t %d\n",list[i].name,list[i].mark);
}
}
答案 0 :(得分:3)
使用memcpy()
复制数组:
memcpy(list_second, list_first, sizeof(list_first));
当前的分配尝试不正确,因为它访问超出数组的边界(数组具有零基索引,因此有效索引从0
运行到size - 1
)导致未定义的行为:
list_second[size] = list_first[size];
即使它不是,它也只会复制其中一个元素,因为list_second
未初始化是垃圾的原因。
答案 1 :(得分:1)
list_second[size] = = list_first[size];
是未定义的行为,因为list_second
和list_first
的允许索引为0
到size - 1
。因此,使用size
作为索引,尝试解决最后一个元素后面的数组元素。
要复制所有阵列成员,请使用:
for (size_t sizeCnt = 0; sizeCnt < size, ++ sizeCnt)
{
list_second[sizeCnt] = list_first[sizeCnt];
}
注意:要访问数组元素以及寻址内存,首选整数类型为size_t
,它被定义为unsigned
类型,足以访问平台地址空间。
答案 2 :(得分:0)
将list_second[size] = list_first[size];
更改为memcpy(list_second,list_first,sizeof(list_first));
您需要复制结构数组,而不是元素。同样array[3]
表示由3个元素组成的数组。所以2是允许的最大索引。 array[3]
无效