我不明白我如何使用指向结构的指针。我试着用一个非常简单的例子,但它没有用。
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 结构中的价值?
答案 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;
}