2016-08-18 93 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