0
#include <stdio.h>
#include <stdlib.h>
#define VEL 2
typedef struct
{
    char ime[15];
    char prezime[15];
    int dob;
    int staz;
} employee;
void upis(employee *);
void ispis(employee *);
int main(int argc, char **argv)
{
    employee radnik[VEL];

    upis(&radnik[VEL]);
    ispis(&radnik[VEL]);
    return 0;
}

void upis(employee * r)
{
    int i;

    printf("Upis podataka:\n==============\n");
    for (i = 0; i < VEL; i++)
    {
        printf("Upisite ime i prezime %d. radnika:\n", i + 1);
        scanf(" %15[^\n]", (r + i * sizeof(employee))->ime);
        scanf(" %15[^\n]", (r + i * sizeof(employee))->prezime);
        printf("Upisite dob i staz %d. radnika:\n", i + 1);
        scanf("%d", &(r + i * sizeof(employee))->dob);
        scanf("%d", &(r + i * sizeof(employee))->staz);
    }
}

void ispis(employee * r)
{
    int i;

    for (i = 0; i < VEL; i++)
    {
        printf("Ime:%s\nPrezime:%s\n", (r + i * sizeof(employee))->ime,
               (r + i * sizeof(employee))->prezime);
        printf("Dob:%d\nStaz:%d\n\n", (r + i * sizeof(employee))->dob,
               (r + i * sizeof(employee))->staz);
    }
}

コードは実際には機能しますが、最終的には常にセグメンテーション違反を返します。ポインターと構造体要素のアドレス指定で何か間違ったことをしたと思います。助けてください、事前に感謝します!!

編集:皆さん、それぞれの回答が役に立ちました!

4

2 に答える 2

4

エラーは次のような式です。

(r + i*sizeof(employee))->ime;

次のように修正します。

(r + i)->ime;

構造体へのポインターを読む 構造体へのポインターの使用方法を学習します。

ポインタ演算は整数演算とは異なることに注意してください。ポインタ結果のアドレスポイントに 1 を加算すると、次の場所を指します (わざわざ値を計算する必要はありません)。したがって、コードでは、従業員の配列のrn番目の従業員をr + 1指す場合、(n + 1)番目の従業員を指します。
理解するには、10.2 ポインターと配列を読んでください。ポインター演算ポインター演算

編集:

@Jens Gustedt Notice として、メイン コードも次のように修正します。

upis(radnik);
ispis(radnik);

配列を関数 (または最初の要素のアドレス) に渡したい場合。

さらに、scanf を使用して行を読み取るのを避け、代わりに fgets() readを使用して行をscanf()読み取る .

于 2013-10-08T11:22:53.753 に答える
2

このコードには根本的な欠陥があります:

employee radnik[VEL];

upis(&radnik[VEL]);
ispis(&radnik[VEL]);

0あなたの場合、Cの配列は上から上にインデックス付けさVEL-1れます。配列を超えて要素のアドレスを取得し、後で使用しています。これには動作が定義されていないため、何でも発生する可能性があります。

于 2013-10-08T11:45:47.090 に答える