2016-08-18 80 views
0
我有麻烦内部结构指针分配值

,我有这样的结构:里面的结构指针分配值

typedef struct{ 
    int numCliente; 
    tCadena nombre; 
    char *iva; 
    int *tiposerv; 
    float *monto; 
}tCliente; 

,我有一个功能:

tCliente cargarUno(int numC){ 

    tCliente reg; 

    char letra; 
    int serv; 
    float mon; 

    reg.numCliente=numC; 

    fflush(stdin); 
    printf("\nIngrese Nombre del cliente:"); 
    leeCad(reg.nombre,20); 

    printf("\nIngrese condicion de IVA(M-Monotributista,R-Responsable Inscripto,E- IVA Exento):"); 
    fflush(stdin); 
    scanf("%c",&letra); 
    &reg->iva = &letra; 
    fflush(stdin); 

    printf("\nIngrese tipo de servicio(1 2 3):"); 
    scanf("%d",&serv); 
    &reg->tiposerv = &serv; 


    printf("\nIngrese monto a cobrar:"); 
    scanf("%f",&mon); 
    &reg->monto= &mon; 

    return reg; 
} 

当我尝试显示结构,指针没有显示我放的值。

void mostrarUno(tCliente c){ 

    printf("Numero del cliente:%d",c.numCliente); 

    printf("\n Nombre del cliente:%s",c.nombre);  

    printf("\n Condicion IVA:%c",*c.iva); 
    printf("\n Tipo de servicio:%d",*c.tiposerv); 

    printf("\n Monto a Cobrar:%f",*c.monto); 
    printf("\n"); 
    printf("\n"); 

} 
+1

'fflush(标准输入);'调用*未定义的行为*在标准中,所以你不应该使用它。 – MikeCAT

回答

1

您正在为本地变量指派指向结构字段的指针。例如,&reg->tiposerv = &serv;使字段tiposerv指向serv,这是函数中的局部变量。

当函数返回到main时,那些局部变量被销毁。这就是为什么你没有得到他们的价值。如何使用malloc动态分配指针字段。例如:

reg.tiposerv = malloc(sizeof(int)); 
*(reg.tiposerv) = serv; 
+0

我一直在想,那么我该如何分配值呢? –

+1

1)“例如,&reg-> tiposerv = &serv;'使字段'tiposerv'指向'serv'”,这是错误的。该语句将发出编译错误。 2)'new'不支持(至少是标准的)C. – MikeCAT

+0

我更新了答案 – AhmadWabbi

1

首先,&reg->iva = &letra;,因为操作者->之前&操作者评估和reg不是指针&reg->tiposerv = &serv;&reg->monto= &mon;将发出编译错误。 你应该写如(&reg)->iva或更简单reg.iva

然后,停止分配指向非静态局部变量的指针。它们在退出它们的范围时会消失(在这种情况下,退出函数cargarUno()),并且在那之后取消引用指针将调用未定义的行为。 一种解决方式是动态分配内存的一些像这样的:

char *letra = malloc(sizeof(char)); 
int *serv = malloc(sizeof(int)); 
float *mon = malloc(sizeof(float)); 
/* check if the allocations are successful here */ 

/* ... */ 

scanf("%c",letra); 
reg.iva = letra; 

/* correct lefthand operand of = as descrived above 
* and remove & on the left of serv and mon like this */ 

如果你只分配指向单一的数据,你会不会处理数组,我不认为使用指针像这样的好。为什么不干脆直接存储数据是这样的:

typedef struct{ 
    int numCliente; 
    tCadena nombre; 
    char iva; 
    int tiposerv; 
    float monto; 
}tCliente; 

/* ... */ 

scanf("%c",&reg.iva); 

/* ... */ 

scanf("%d",&reg.tiposerv); 

/* ... */ 

scanf("%f",&reg.monto); 
0

你没有分配的tCliente reg;的内存空间。 在分配结构中元素的值之前,您应该首先分配mem空间。

我修改你的函数cargarUno()如下:

void cargarUno(tCliente *reg, int numC){ 

//tCliente reg; 

... 
reg->numCliente=numC; 

... 
leeCad(reg->nombre,20); 

... 
reg->iva = &letra; 

... 
reg->tiposerv = &serv; 

... 
reg->monto= &mon; 

//return reg; 
} 

并尝试分配的内存空间用于tCliente * REG,

int i=X; // assign the int you desire 
tCliente *reg=malloc(sizeof(tCliente)); 
cargarUno(reg,i); 
+1

C自20世纪80年代初以来一直能够返回整个结构;问题中的代码在分配'reg'时没有问题。 –

+0

@Jonathan Leffler是的,你是对的。在这个问题中没有必要为结构分配mem。 – CWLiu