下面以函數返回局部變量的指針舉幾個典型的例子來說明:
1:
- #include <stdio.h>
- char *returnStr()
- {
- char *p="hello world!";
- return p;
- }
- int main()
- {
- char *str;
- str=returnStr();
- printf("%s\n", str);
- return 0;
- }
2:
- #include <stdio.h>
- char *returnStr()
- {
- char p[]="hello world!";
- return p;
- }
- int main()
- {
- char *str;
- str=returnStr();
- printf("%s\n", str);
- return 0;
- }
3:
- int func()
- {
- int a;
- ....
- return a; //允許
- }
- int * func()
- {
- int a;
- ....
- return &a; //無意義,不應該這樣做
- }
局部變量也分局部自動變量和局部靜態變量,由於a返回的是值,因此返回一個局部變量是可以的,無論自動還是靜態,
因爲這時候返回的是這個局部變量的值,但不應該返回指向局部自動變量的指針,因爲函數調用結束後該局部自動變量
被拋棄,這個指針指向一個不再存在的對象,是無意義的。但可以返回指向局部靜態變量的指針,因爲靜態變量的生存
期從定義起到程序結束。
- #include <stdio.h>
- char *returnStr()
- {
- static char p[]="hello world!";
- return p;
- }
- int main()
- {
- char *str;
- str=returnStr();
- printf("%s\n", str);
- return 0;
- }
- int* func( void )
- {
- static int a[10];
- ........
- return a;
- }
6:返回指向堆內存的指針是可以的
- char *GetMemory3(int num)
- {
- char *p = (char *)malloc(sizeof(char) * num);
- return p;
- }
- void Test3(void)
- {
- char *str = NULL;
- str = GetMemory3(100);
- strcpy(str, "hello");
- cout<< str << endl;
- free(str);
- }