试图将整个结构复制到另一个相同类型的结构......但是得到错误

时间:2013-05-06 10:50:00

标签: c

朋友们,我正在尝试将整个结构复制到另一个结构中。当我编译时,我没有得到错误....当我打印显示一些垃圾价值....请指导我...谢谢!

在两个不同的功能中,我正在尝试添加值并打印它。我的第一个功能是“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);
    }
}

3 个答案:

答案 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_secondlist_first的允许索引为0size - 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]无效