(本文年代久遠,請謹慎閱讀)現有如下程式段:
void
getmem
(char **p,int n)
intmain
(void)
執行無誤,輸出hello,沒有問題;
修改之後如下:
void
getmem
(char *p,int n)
intmain
(void)
上述輸出為null,其實不小心犯了個低階錯誤,那就是:
呼叫getmem時是值傳遞,str本身在getmem之後並沒有獲得相應空間,原因即getmem中的*p 作為區域性變數並不能將p返回到main函式,即它只讓區域性的p指向了一段空間,沒有意義。
而如果形參改為開始的
getmem(char **p,int n)
呼叫時使用
getmem(&str,100);
其意思是:char *p即指向指標的指標,意為「p指向乙個變數,此變數存放的不是具體資料,而是乙個指標的位址」,p 即表示其所指的位址變數,顯然,此處被指向的指標即str,那麼getmem中的
*p=(char *)malloc(n);
即表示此「被指向的指標」,即str指向一段空間,而區別於值傳遞的是此處實參為&str,其結束呼叫後會改變其指向。
此處會改變的原因:本質仍為值傳遞,但是傳遞的不是此指標(不同於前面的getmem(str,100)),而是指標所存放的位址,其被 p所指向,然後在函式中通過p修改了p指向內容的值,即修改了str的位址,即呼叫後str指向發生改變。
char *str中,str是乙個位址,printf(str)中str也是個位址,只不過格式控制型別為%s,這樣的print即從str位址開始一直輸出,直到』\0』為止(終結符是系統自動加上的),這樣便實現列印字串的工作,好像str真作為乙個變數存放了這個串,其實不然。
另外,不用函式的方式來開闢空間確實就不需要**p這麼麻煩:
int
main
(void)
上述即可以完成對char *str開闢空間的工作,此外,除了用malloc手動申請空間,也可以用陣列賦值的方式:
int
main
(void)
? 留下您對該文章的評價 ?
C語言中函式引數的傳值問題
c語言中引數的傳值一直比較含糊,今天在網上看到三個面試題的詳解,感覺講的很好,就拿來記下,方便學習和記憶。1.考題一 程式 如下 void exchg1 int x,int y void main 輸出的結果 x y a b 問下劃線的部分應是什麼,請完成。2.考題二 如下。exchg2 int p...
C語言函式返回值的相關問題
程式一 int main return 0 int fun void int q str return q 不能正確返回 雖然str是在動態變數區,而該動態變數是區域性的,函式結束時不保留的。程式二 int main char fun void 可以正確返回 但是,字串 hello 不是變數,而是乙...
C語言函式返回值的相關問題
程式一 int main return 0 int fun void int q str return q 正確返回 static修飾符,陣列被儲存在了靜態儲存區。程式二 int main char fun void 可以正確返回 但是,字串 hello 不是變數,而是乙個常量,編譯程式在處理這種常...