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