#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);
}
}
代码实际上有效,但最终总是会返回分段错误。我猜测我对指针和寻址结构元素做错了。请提前帮助和谢谢!!
编辑:谢谢大家,每个答案都有帮助!
答案 0 :(得分:4)
错误是表达式:
(r + i*sizeof(employee))->ime;
将其更正为:
(r + i)->ime;
阅读Pointer to structure了解如何使用指向struct的指针。
注意指针算术与整数算术不同。当您向指针添加1时,地址指向下一个位置(您不需要费心去计算值)。因此,在您的代码中,如果r
指向员工数组中的n th 员工,则r + 1
指向(n + 1) th 员工。
要理解阅读10.2 Pointers and Arrays; Pointer Arithmetic和Pointer Arithmetic。
修改强>
正如@Jens Gustedt Notice所述,您的主要代码更正如下:
upis(radnik);
ispis(radnik);
如果要将数组传递给函数(或第一个元素的地址)。
另外要避免scanf读取行而是使用fgets()读取Reading a line using scanf()
not good?。
答案 1 :(得分:2)
此代码存在根本缺陷:
employee radnik[VEL];
upis(&radnik[VEL]);
ispis(&radnik[VEL]);
在您的案例中,C中的数组从0
索引到VEL-1
。您将获取数组之外的元素的地址,然后使用它。这没有明确的行为,所以任何事情都可能发生。