1. 程式人生 > 其它 >C語言中的結構體作為函式引數,不會修改實參的值的問題

C語言中的結構體作為函式引數,不會修改實參的值的問題

技術標籤:指標c語言結構體

在做小專案時遇到一個問題,將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;
}