1

こんにちは、構造全体を別の構造にコピーしようとしています。コンパイルすると、エラーが発生しません....印刷すると、ガベージ値が表示されます....ガイドしてください...ありがとう!

2 つの異なる関数で、値を追加して印刷しようとしています。私の最初の関数は「read_list」です...これで、ユーザーから学生の名前と挿入されたマークを取得しています。

私の2番目の機能は「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));

現在の割り当ての試行は、配列の境界を超えてアクセスしているため正しくありません (配列にはゼロベースのインデックスがあるため、有効なインデックスは から まで実行さ0れますsize - 1) 未定義の動作を引き起こします:

list_second[size] = list_first[size];

そうでない場合でも、要素の1つだけをコピーするだけであり、が初期化されていないため、ガベージが出力される理由list_secondです。

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

許可されるインデックス tolist_secondおよびtolist_first0toであるため、 は未定義の動作size - 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];してください。3 つの要素の配列memcpy(list_second,list_first,sizeof(list_first));も意味します。array[3]したがって、許可される最大インデックスは 2 です。array[3]無効です

于 2013-05-06T10:58:03.120 に答える