主返回后的分段错误(指向struct数组的指针)

时间:2013-10-08 11:20:36

标签: c pointers

#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);
    }
}

代码实际上有效,但最终总是会返回分段错误。我猜测我对指针和寻址结构元素做错了。请提前帮助和谢谢!!

编辑:谢谢大家,每个答案都有帮助!

2 个答案:

答案 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 ArithmeticPointer 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。您将获取数组之外的元素的地址,然后使用它。这没有明确的行为,所以任何事情都可能发生。