最近看面試題,遇到一些關於通過函式改變乙個變數的值得問題,現在終結一下:
先看下面一段**:
#include
#include void getmemory(char *p)
void test(void)
執行結果:段錯誤
錯誤原因分析:str 是乙個指標變數,傳入getmemory(str);的只是str的乙個拷貝,所以str 的值沒有改變,一直是null。而呼叫strcpy() 後,訪問了非法的記憶體,所以產生段錯誤。
注意:由於getmemory();中動態申請的記憶體沒有釋放,所以會造成記憶體洩漏
解決辦法如下:
使用二級指標
#include #include void getmemory(char **p)
void test(void)
分析:由於傳入的是乙個指向 指標(str)的指標,也就是二級指標,所以可以通過這個二級指標來改變str (指標變數)的值,所以str的值會被改變。
缺點:用完沒有及時釋放記憶體,會造成記憶體洩漏。
總結:1. 形參只是外部乙個變數的拷貝,而且是單向傳遞的,改變形參不會對實參造成影響。
2. 要想通過函式改變乙個變數的值,需要通過指標來完成,比如:改變乙個int 型變數的值,需要傳入的形參為指向int 變數的指標。要改變乙個一級指標的指向(指標變數的值),需要傳入的形參為二級指標。因為指標本身也可以是個變數。
PHP通過copy 函式來複製乙個檔案
php通過copy 函式來複製乙個檔案。用法如下 bool copy string source,string dest 其中 source是原始檔的路徑,dest是目的檔案的路徑。函式將 source下的檔案複製到 dest路徑下,如果成功複製則返回true,否則返回false。source 1....
c語言中getchar 函式乙個常見Error
getchar 從這個名字來看應該是 得到乙個字元。正好c語言裡面有乙個char型別,很容易就出現了如下程式 include int main void return 0 主要談一下下面這條語句 while c getchar eof 首先 getchar函式的原型是 int getchar voi...
C 通過輸入數來確定乙個陣列的動態大小
這個和編譯器有關 一維 cin n int a new int n 但是new出來的一定不要忘了delete掉 delete a 正確的用法 delete a 錯誤的用法後者相當於delete a 0 漏掉了另外n 1個物件。二維 設有m行n列 cin m n int a new int m for...