C 试图将整个结构复制到同一类型的另一个结构…但出现错误

C 试图将整个结构复制到同一类型的另一个结构…但出现错误,c,C,嗨,朋友们,我正在尝试将整个结构复制到另一个结构。当我编译时,我不会出错…当我打印时会显示一些垃圾值…请指导我…谢谢 在两个不同的函数中,我尝试添加值并打印它。我的第一个函数是read_list…在这个函数中,我得到了学生的名字和从用户插入的标记 我的第二个函数是print_list,使用这个函数我可以打印学生的详细信息 请引导我到一个教程,在那里我可以找到一些使用C语言结构的非常有趣的例子 #include<stdio.h> typedef struct _student {

嗨,朋友们,我正在尝试将整个结构复制到另一个结构。当我编译时,我不会出错…当我打印时会显示一些垃圾值…请指导我…谢谢

在两个不同的函数中,我尝试添加值并打印它。我的第一个函数是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);
    }
}
是未定义的行为,因为允许列出_second和列出_first的索引大小为0到-1。因此,使用size作为索引,可以尝试寻址最后一个元素后面的数组元素

要复制所有阵列成员,请使用:

for (size_t sizeCnt = 0; sizeCnt < size, ++ sizeCnt)
{
  list_second[sizeCnt] = list_first[sizeCnt]; 
}
注意:要访问数组元素以及地址内存,首选的整数类型是size\u t,它被定义为一种无符号类型,其宽度足以访问平台地址空间

是未定义的行为,因为允许列出_second和列出_first的索引大小为0到-1。因此,使用size作为索引,可以尝试寻址最后一个元素后面的数组元素

要复制所有阵列成员,请使用:

for (size_t sizeCnt = 0; sizeCnt < size, ++ sizeCnt)
{
  list_second[sizeCnt] = list_first[sizeCnt]; 
}
注意:要访问数组元素以及寻址内存,首选的整数类型是size\u t,它被定义为无符号类型,宽度足以访问平台地址空间。

使用memcpy复制数组:

memcpy(list_second, list_first, sizeof(list_first));
当前分配尝试不正确,因为它访问的数组超出了数组的界限。数组具有基于零的索引,因此有效索引从0运行到大小-1,从而导致未定义的行为:

list_second[size] = list_first[size];
即使不是,它也只会复制其中一个元素,这也是打印垃圾的原因,因为list_second未初始化。

使用memcpy复制数组:

memcpy(list_second, list_first, sizeof(list_first));
当前分配尝试不正确,因为它访问的数组超出了数组的界限。数组具有基于零的索引,因此有效索引从0运行到大小-1,从而导致未定义的行为:

list_second[size] = list_first[size];

即使不是,它也只会复制其中一个元素,这也是打印垃圾的原因,因为list_second未初始化。

更改list_second[size]=list_first[size];对于memcpylist_second,list_first,sizeoflist_first;您需要复制结构的数组,而不是元素。数组[3]也指由3个元素组成的数组。所以2是允许的最大索引。数组[3]无效

更改列表第二个[size]=列表第一个[size];对于memcpylist_second,list_first,sizeoflist_first;您需要复制结构的数组,而不是元素。数组[3]也指由3个元素组成的数组。所以2是允许的最大索引。数组[3]无效

memcpy list\u second,list\u first,sizeofstudent*size;memcpy list_second,list_first,sizeofstudent*size;谢谢,这帮了我,这帮了我