变量是否在数组内c语言,函数内创建的数组在调用后,是否就不存在
函數(shù)內(nèi)創(chuàng)建的數(shù)組在調(diào)用后,是不是就不存在
本帖最后由 test_lockxxx 于 2014-04-23 09:31:06 編輯
第1種寫法:
char?*getABC()
{
char?str[10];
strcpy(str,"12345");
return?str;
}
void?main()
{
char?*p?=?getABC();
printf("%s\n",p);???//這樣正確嗎?p?指向的位置是不是已被?自動釋放了,
}
第2種寫法
void?getABC(char?*pStr)
{
strcopy(pStr,"123456");
}
void?main()
{
char?str[10];
getABC(str);
printf("%s\n",p);???//這樣正確嗎?
}
------解決方案--------------------
第二種正確(如果不是寫錯的話)
c是一種比較靠近底層的語言。
------解決方案--------------------
第一種返回了局部變量的地址,這個地址指向的內(nèi)容在函數(shù)結(jié)束后可能被修改,所以你取p的值的時候可能會得不到你想得到的內(nèi)容
------解決方案--------------------
生命周期的問題。?可以在堆上申請空間。
------解決方案--------------------
就回收了的???棧就是這樣
------解決方案--------------------
驗證了一下:
寫法1,打印出來的是亂碼。?---?數(shù)組被釋放了,該內(nèi)存地址內(nèi)容是隨機的,str[10]是全局變量就不存在問題。
方法2,是對的,指針傳遞。?不過有兩處語法錯誤。
------解決方案--------------------
這樣也對:
char?*getABC()
{
static?char?str[10];
strcpy(str,"12345");
return?str;
}
void?main()
{
char?*p?=?getABC();
printf("%s\n",p);???//這樣正確嗎?p?指向的位置是不是已被?自動釋放了,
}
------解決方案--------------------
建議你去看看數(shù)據(jù)的存儲,這就是一個數(shù)據(jù)存儲類型的問題
------解決方案--------------------
你想知道的是這些?
用這樣的方式,如
int?a[16]
這個數(shù)組是被當作直接存取的數(shù)據(jù),生命周期在作用域內(nèi),過了就不存在了。
但是如果用
int?*?a?=new??int[16];
這個數(shù)組需要手動釋放,這就是C++反對者會說C++不好的原因之一了
但是需要知道
a?本身也是個?UNIT變量,所以如果這句話在函數(shù)中出現(xiàn),那么?a?的生命周期也是這個函數(shù)體。
但是a指向的數(shù)組內(nèi)存是一直存在的,需要手動釋放。
PS:你問的這個問題,和堆棧關(guān)系不大。
------解決方案--------------------
char?*getABC()
{
char?str[10];
strcpy(str,"12345");
return?str;?//理論上,這是錯誤的
}
void??print_data()
{
char?str[80];
printf("str=%p",str);
}
void?str_test()
{
char?str[10];
char?*s,*t;
char?*p?=?getABC();
register?int?i;
for(s=p,t=str,i=0;i<10;i++)
*t++=*s++;?//這么處理,可以勉強把數(shù)據(jù)復制出來,而不錯誤
printf("%s\n",str);???//輸出是正確的,但是從C語言來說,卻是錯誤的;
//因為返回的數(shù)組地址,是個超過生存周期的數(shù)組的地址,
//這個地址對應的內(nèi)存,可能會另作他用比如,局部變量,調(diào)用函數(shù)傳遞的參數(shù),函數(shù)返回地址等等
//這里??.str,"%s\n"?這兩個參數(shù),以及printf函數(shù)的局部變量;
//可能會占用p這個指針表示的地址.
//所以輸出可能不正確.
printf("p?=?%p,",p);
}
------解決方案--------------------
第二種方法是正確的,因為strcpy的字符串實際上是拷貝到了main函數(shù)的數(shù)組str中。所以,在main函數(shù)里可以正確輸出拷貝后的字符串。
------解決方案--------------------
char?*getABC()
{
char?*str="12345";//這樣也對
//strcpy(str,"12345");
return?str;
}
void?main()
{
char?*p?=?getABC();
printf("%s\n",p);???//這樣正確嗎?p?指向的位置是不是已被?自動釋放了,
}
總結(jié)
以上是生活随笔為你收集整理的变量是否在数组内c语言,函数内创建的数组在调用后,是否就不存在的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 保卫萝卜安卓版下载,保卫萝卜官方网站(保
- 下一篇: c语言万能预编译,Objective-C