访问结构数组中的数据

时间:2016-02-06 20:16:51

标签: c data-structures

我不明白我如何使用指向结构的指针。我试着用一个非常简单的例子,但它没有用。

typedef struct
{
char nombre [100], domicilio [200];
int codigo_postal, nro_documento;
unsigned char edad_sexo;
}
t_persona;

int main()
{
int edad;
char sexo;
t_persona* dati=malloc(sizeof(t_persona));
scanf("%d",(*dati).codigo_postal);
    return 0;
}

为什么我的程序会崩溃?我该如何设置 int 结构中的价值?

1 个答案:

答案 0 :(得分:2)

您的程序崩溃了,因为您正在将未初始化的int传递给scanf(),其中指向int的指针。我怀疑你正在编译没有启用警告,因为你正在学习我强烈建议启用编译器警告。

要使用scanf(),您还需要检查它的返回值,如下所示

if (scanf("%d", &dati->codigo_postal) != 1)
    do_something_because_codigo_postal_is_not_initialized();

你必须传递一个指向你的局部变量的指针,让scanf()能够将值存储在其中,如果你只是传递变量,它的值将被视为scanf()将尝试的地址存储结果,导致未定义的行为,并且您的变量从未被初始化,这是导致未定义行为的另一个原因。

此外,请不要像使用malloc()一样检查它的返回值。我会像这样重写所有代码

typedef struct
{
    char nombre[100];
    char domicilio[200];
    int codigo_postal;
    int nro_documento;
    unsigned char edad_sexo;
} t_persona;

int main()
{
    t_persona *dati = malloc(sizeof(*dati)); // Use sizeof(*dati) which is
    if (dati == NULL)                        // far more maintainable.
        return -1; // `malloc()' failed
    if (scanf("%d", &dati->codigo_postal) != 1)
        return -1; // input error
    fprintf(stderr, "%d\n", dati->codigo_postal);
    free(dati);
    return 0;
}