【问题标题】:Segmentation fault after main returns (pointer to struct array)主返回后的分段错误(指向结构数组的指针)
【发布时间】:2013-10-08 11:20:36
【问题描述】:
#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);
    }
}

代码确实有效,但最后总是返回分段错误。我猜我在指针和寻址结构元素方面做错了。请帮助并提前感谢!

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

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    错误是这样的表达式:

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

    改正为:

    (r + i)->ime;
    

    阅读Pointer to structure 了解如何使用指向结构的指针。

    注意指针运算不同于整数运算。当您向指针添加 1 时,结果地址指向下一个位置(您无需费心计算值)。因此,在您的代码中,如果 r 指向员工数组中的 nth 员工,则 r + 1 指向 (n + 1)th 员工。
    要了解请阅读10.2 Pointers and Arrays; Pointer ArithmeticPointer Arithmetic

    编辑:

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

    upis(radnik);
    ispis(radnik);
    

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

    另外避免使用 scanf 读取行,而是使用 fgets() 读取 Reading a line using scanf() not good?

    【讨论】:

    • 除此之外,最好向 OP 解释一下,在 C 中,当您将整数添加到指针时,指针的增量等于该整数乘以指针指向的类型。
    【解决方案2】:

    此代码存在根本缺陷:

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

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

    【讨论】:

    • 其实这是第一个bug..我没注意到。
    猜你喜欢
    • 2023-03-17
    • 2018-07-29
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多