作者:曹忠明,華清遠(yuǎn)見嵌入式學(xué)院講師。
很多剛學(xué)指針的人多會(huì)遇到這樣的情況,就是你給一個(gè)函數(shù)傳遞一個(gè)指針變量,在這個(gè)函數(shù)中為這個(gè)指針申請(qǐng)空間,賦值,可是等函數(shù)結(jié)束后這個(gè)指針還是一個(gè)空指針,對(duì)其的操作編譯器會(huì)報(bào)段錯(cuò)誤或干脆給你一個(gè)莫名其妙的值,這是一個(gè)隨機(jī)數(shù)。
如:
#include <stdio.h>
#include <stdlib.h>
int my_fun(int *p)
{
p = (int *)malloc(sizeof(int));
*p = 101;
return 0;
}
int main(int argc, char **argv)
{
int *p;
my_fun(p);
printf(“%dn”,*p);
return 0;
}
這個(gè)函數(shù)最終打印的結(jié)果是一個(gè)隨機(jī)數(shù)。這是為什么呢?
這里先說(shuō)一點(diǎn)函數(shù)調(diào)用時(shí)候的事情:
函數(shù)在被調(diào)用的時(shí)候,系統(tǒng)動(dòng)態(tài)的為其在堆棧區(qū)非配一段空間,這段空間的作用是:
1、 在進(jìn)入函數(shù)前保存環(huán)境變量和返回地址。
2、 在進(jìn)入函數(shù)時(shí)保存實(shí)參的拷貝。
3、 在函數(shù)體內(nèi),保存局部變量。
在這里可以看出一點(diǎn)什么,就是,在調(diào)用函數(shù)的時(shí)候,系統(tǒng)為函數(shù)動(dòng)態(tài)的分配了一段空間,且為實(shí)參做了拷貝,在函數(shù)中的‘p’只是主函數(shù)中‘p’的一個(gè)拷貝,我們申請(qǐng)空間、賦值等操作都是對(duì)這個(gè)拷貝進(jìn)行的。當(dāng)函數(shù)體結(jié)束的時(shí)候,這個(gè)拷貝的生命也就結(jié)束了,系統(tǒng)收回了為函數(shù)分配的空間,包括這個(gè)拷貝。這就是為什么我們申請(qǐng)空間、賦值等操作看起來(lái)都沒(méi)有效果。
解決這個(gè)問(wèn)題有多種方法,這里就介紹一點(diǎn):
如下就可以解決這個(gè)問(wèn)題:
#include <stdio.h>
#include <stdlib.h>
int *my_fun(int *p)
{
p = (int *)malloc(sizeof(int));
*p = 101;
return p;
}
int main(int argc, char **argv)
{
int *p;
p = my_fun(p);
printf(“%dn”,*p);
return 0;
}
在這里通過(guò)返回值,是函數(shù)中的‘p’的生命期延長(zhǎng)了,最終就達(dá)到了我們預(yù)期的效果。下面這個(gè)也可以完成。
#include <stdio.h>
#include <stdlib.h>
int my_fun(int *p)
{
*p = 101;
return 0;
}
int main(int argc, char **argv)
{
int *p;
p = (int *)malloc(sizeof(int));
my_fun(p);
printf(“%dn”,*p);
return 0;
}
可能我的理解有寫出入,希望大家指點(diǎn)?。?!
“本文由華清遠(yuǎn)見http://www.embedu.org/index.htm提供”
來(lái)源:華清遠(yuǎn)見0次