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 时,结果地址指向下一个位置(您无需费心计算值)。因此,在您的代码中,如果r指向员工数组中的第 n员工,则r + 1指向第 (n + 1)员工。
要了解阅读10.2 指针和数组;指针算术指针算术

编辑:

正如@Jens Gustedt 通知,更正您的主要代码如下:

upis(radnik);
ispis(radnik);

如果您想将数组传递给函数(或第一个元素的地址)。

另外避免 scanf 读取行,而不是使用 fgets() 读取读取行使用scanf()不好?.

于 2013-10-08T11:22:53.753 回答
2

这段代码存在根本缺陷:

employee radnik[VEL];

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

在您的情况下,C 中的数组的索引从0on toVEL-1开始。您正在获取数组之外的元素的地址,然后再使用它。这没有定义的行为,所以任何事情都可能发生。

于 2013-10-08T11:45:47.090 回答