2016-03-28 65 views
2

所以我正在使用嵌套結構和將結構作爲參數傳遞給函數。結構作爲參數傳遞,但不能正常工作

這裏是我的主要功能:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

struct date { 
    int dd; 
    int mm; 
    int yy; 
}; 

struct employee { 
    char fn[50]; 
    char ln[50]; 
    struct date dob; 
    struct date sd; 
    int salary; 
}; 

void take_input(struct employee e); 
void give_output(struct employee e); 

int main(void) 
{ 
    struct employee a; struct employee b; struct employee c; struct employee d; struct employee f; 

    take_input(a); 
    take_input(b); 
    take_input(c); 
    take_input(d); 
    take_input(f); 

    give_output(a); 
    give_output(b); 
    give_output(c); 
    give_output(d); 
    give_output(f); 

    return 0; 
} 

而且這裏有兩個功能:

void take_input(struct employee e) 
{ 
    printf("\nFirst name: "); 
    gets(e.fn); 
    printf("\nLast name: "); 
    gets(e.ln); 
    printf("\nDate of Birth: "); 
    scanf("%d %d %d", &e.dob.dd, &e.dob.mm, &e.dob.yy); 
    printf("\nDate of Joining: "); 
    scanf("%d %d %d", &e.sd.dd, &e.sd.mm, &e.sd.yy); 
    printf("\nSalary: "); 
    scanf("%d", &e.salary); 
} 

void give_output(struct employee e) 
{ 
    printf("%s", e.fn); 
    printf(" %s", e.ln); 
    printf("\nDate of Birth: %d/%d/%d", e.dob.dd, e.dob.mm, e.dob.yy); 
    printf("\nStarting Date: %d/%d/%d", e.sd.dd, e.sd.mm, e.sd.yy); 
    printf("\nSalary: $%d\n", e.salary); 
} 

的問題是採取輸入和存儲數據不正常的功能。每次程序運行時都需要輸入,但打印時會給出一些垃圾值。但是如果我在沒有函數的情況下運行它(在main()函數下),它可以在相同的代碼下正常工作。我似乎無法找出代碼中的問題,所以任何幫助表示讚賞。

回答

3

C使用按值傳遞函數參數傳遞。所以,當你調用函數一樣

take_input(a); 

a臨時副本被傳遞給函數。無論您對被調用函數中的輸入參數所做的任何更改,都不會對調用程序中存在的實際a產生任何影響。

您需要傳遞結構變量的地址,並對被調用函數內部的變量進行更改。只有這樣,所做的更改將反映回從調用函數傳遞的實際參數。

+0

按價值傳遞大型結構也可能會造成嚴重的性能下降。 – tofro