1. 程式人生 > >C語言中,如何通過函式來改變一個變數的值

C語言中,如何通過函式來改變一個變數的值

最近看面試題,遇到一些關於通過函式改變一個變數的值得問題,現在終結一下:

先看下面一段程式碼:

#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 變數的指標。要改變一個一級指標的指向(指標變數的值),需要傳入的形參為二級指標。因為指標本身也可以是個變數。

相關推薦

no