C語言中,如何通過函式來改變一個變數的值
阿新 • • 發佈:2019-01-16
最近看面試題,遇到一些關於通過函式改變一個變數的值得問題,現在終結一下:
先看下面一段程式碼:
#include <stdio.h>
#include <stdlib.h>
void GetMemory(char *p)
{
p=(char*)malloc(100);
}
void Test(void)
{
char *str=NULL;
GetMemory(str);
strcpy(str,"hello world");
printf("%s\n",str);
}
執行結果:段錯誤
錯誤原因分析:str 是一個指標變數,傳入GetMemory(str);的只是str的一個拷貝,所以str 的值沒有改變,一直是NULL。而呼叫strcpy() 後,訪問了非法的記憶體,所以產生段錯誤。
注意:由於GetMemory();中動態申請的記憶體沒有釋放,所以會造成記憶體洩漏
解決辦法如下:
使用二級指標
#include <stdio.h>
#include <stdlib.h>
void GetMemory(char **p)
{
*p=(char*)malloc(num);
}
void Test(void)
{
char *str=NULL;
GetMemory(&str);
strcpy(str,"hello world");
printf("%s\n",str);
}
分析:由於傳入的是一個指向 指標(str)的指標,也就是二級指標,所以可以通過這個二級指標來改變str (指標變數)的值,所以str的值會被改變。
缺點:用完沒有及時釋放記憶體,會造成記憶體洩漏。
總結:
1. 形參只是外部一個變數的拷貝,而且是單向傳遞的,改變形參不會對實參造成影響。
2. 要想通過函式改變一個變數的值,需要通過指標來完成,比如:改變一個int 型變數的值,需要傳入的形參為指向int 變數的指標。要改變一個一級指標的指向(指標變數的值),需要傳入的形參為二級指標。因為指標本身也可以是個變數。