#include<stdio.h>
#include<stdlib.h>
char *function1()
{
char *a="cdefgh";//在靜態存儲區分配,一直到程序結束
return a;
}
char *function2()
{
char a[]="cdefgh";//在棧中分配,函數結束時釋放
return a;
}
char a[]="cdefgh";
/*這個是常量字串的拷貝,
相當於strcpy(a,"cdefgh"),
這樣寫都會有字串拷貝,
造成時間和空間上的開銷,
如果字串很長儘量不要這樣寫,
由於字元陣列a在棧上,
所以在函數結束後它便無效了..
---------------
char *a="cdefgh";
a直接指向常量字串,
這個字串保存在靜態存儲區中...
所以在函數結束後,它返回的位址仍然有效..
*/
int main()
{
char test[]="123";
test[0]='a';//可以修改數組內部元素的值
char* test1="456";
*test1='7';//test1不可以修改,是const char*的類型的值
/*char *a="cdefgh";
此時a為const char*,
也就是說你不能改變*a的值。
char a[]="cdefgh";你可以通過a[i]改變它的值。*/
char *i=NULL ;
char *j=NULL;
i= function1();//結吉確定
j= function2();//結果不確定
printf("\n%s\n",i);
printf("\n%s\n",j);
system("pause");
}
/*(1)function1()的a和function2()的a都是自動變數,都在棧上分配空間
(2)function1()的a分配的空間=sizeof(char *)=sizeof(void *),
任何指標的大小都是相同的,指向靜態資料區存的"cdefgh"
(3)function2()的a分配的空間=strlen("cdefgh")+1,並且用來保存"cdefgh"
(4)返回的指標,function1指向靜態資料區,function1指向棧(已自動釋放)
故function1的值是對的
*/