日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

变量是否在数组内c语言,函数内创建的数组在调用后,是否就不存在

發(fā)布時間:2023/12/2 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 变量是否在数组内c语言,函数内创建的数组在调用后,是否就不存在 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

函數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。