1

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

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

3 回答 3

3

用于memcpy()复制数组:

memcpy(list_second, list_first, sizeof(list_first));

当前的分配尝试不正确,因为它正在访问超出数组的边界(数组具有从零开始的索引,因此有效索引从0to运行size - 1)导致未定义的行为:

list_second[size] = list_first[size];

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

于 2013-05-06T10:53:36.490 回答
1
list_second[size] = = list_first[size];

是未定义的行为,因为允许的索引list_secondlist_first0size - 1因此,使用size作为索引您尝试解决最后一个元素后面的数组元素。

要复制所有数组成员,请使用:

for (size_t sizeCnt = 0; sizeCnt < size, ++ sizeCnt)
{
  list_second[sizeCnt] = list_first[sizeCnt]; 
}

注意:要访问数组元素以及寻址内存,首选整数类型是size_t,它被定义为unsigned足够宽以访问平台地址空间的类型。

于 2013-05-06T10:53:19.310 回答
0

更改list_second[size] = list_first[size];memcpy(list_second,list_first,sizeof(list_first));您需要复制结构数组,而不是元素。也array[3]意味着一个由 3 个元素组成的数组。所以 2 是允许的最大索引。array[3]是无效的

于 2013-05-06T10:58:03.120 回答