C語言中的結構體作為函式引數,不會修改實參的值的問題
阿新 • • 發佈:2020-12-11
在做小專案時遇到一個問題,將main函式的結構體作為引數傳遞時,在函式中修改結構體的值,出了函式後不會修改實參的值,即C語言中將結構體作為引數傳遞時,並不會改變實參的值!
原因是當結構體指標傳遞給函式時,會拷貝一份指標的值,但是函式內部的指標和函式外部的指標並不是指向同一個引用的,所以才會使得函式裡面改變了,但是函式外部無變化,解決方案是在傳參的時候,將結構體指標的傳遞過去,同時將原來的 ’ .屬性’改為’->屬性’符號。
無效的傳遞方式 :
這樣寫函式,傳遞來的指標和函式內部的指標不是同一個
int create_user(Account act) { act.user = 1001; act.money = 0; char filename[40] = {}; sprintf(filename,"%ld.txt",act.user); int fd = open(filename,O_WRONLY|O_CREAT|O_EXCL,0644); if(0 > fd) { perror("open"); return -1; } write(fd,&act,sizeof(Account)); user++; puts("儲存賬戶成功"); close(fd); return 0; }
有效的傳遞方式 :
在Account結構體後加上*,這樣傳遞過來的指標和函式內部的指標就使用的是同一個了,同時將.屬性改為->屬性
int create_user(Account* act) { act->user = 1001; act->money = 0; char filename[40] = {}; sprintf(filename,"%ld.txt",act->user); int fd = open(filename,O_WRONLY|O_CREAT|O_EXCL,0644); if(0 > fd) { perror("open"); return -1; } write(fd,act,sizeof(Account)); user++; puts("儲存賬戶成功"); close(fd); return 0; }