字串輸出的幾種情況 關於記憶體問題

2021-07-23 04:03:03 字數 1898 閱讀 4237

不錯

值傳遞不會傳遞動態記憶體,址傳遞才會傳遞動態記憶體。注意:值傳遞(任何時候,引數傳遞都是拷貝形式);址傳遞是傳遞本身(記憶體),值傳遞傳遞替身。

#include

#include

#include

void getmemory(char *p, int num)

void test(void)

int main()

void test(void)

//strcpy(str, "hello");

//printf(str);

}int main()

輸出null

#include

#include

#include

void getmemory(char *p, int num)

void test(void)

int main()

//out

00000000  //表示該指標為null

請按任意鍵繼續. . .

good

2、#include

#include

#include

char *getmemory(void)

void test(void)

int main()

//out

001df678

€ ? 請按任意鍵繼續. . .     //每次執行的結果不同的

分析:可能是亂碼。因為getmemory 返回的是指向「棧記憶體」的指標,該指標的位址不是 null,但其原來的內容已經被清除,新內容不可知。

3、#include

#include

#include

void getmemory(char **p, int num)

void test(void)

int main()

//out

hello請按任意鍵繼續. . .

位址傳遞可以輸出hello (2)記憶體洩漏

4、#include

#include

#include

void test(void)

}int main()

//out

00682a98

world請按任意鍵繼續. . .

分析:篡改動態記憶體區的內容,後果難以預料,非常危險。

因為free(str); 之後,str 成為野指標,if(str != null)語句不起作用。 5.

char *getmemory3(int num)

void test3(void)

請問執行test 函式會有什麼樣的結果?

答:輸出

」hello」

,因為是返回動態申請的記憶體,只要不釋放記憶體,即呼叫

free

函式,就可以使用該段記憶體。

6.#include

#include

#include

#include

using namespace std;

char *getstring2(void)

void test5(void)

int main()

//out

hello world

請按任意鍵繼續. . .

答:函式test5

執行雖然不會出錯,但是函式getstring2的設計概念卻是錯誤的。因為getstring2內的

「hello world

」是常量字串,位於靜態儲存區,它在程式生命期內恆定不變。無論什麼時候呼叫getstring2

,它返回的始終是同乙個「唯讀

」的記憶體塊。如果此時還想利用strcpy

往str中寫資料時,將出現錯誤。如strcpy(str,

」hello world」)

關於堆排序字串按ASCII碼公升序輸出問題

堆排序思路 在篩選sift的過程中,我們不必每乙個結點都要篩選,而是從最後乙個非葉子結點 n 2向上取整 到根結點 1 進行調整生成乙個最大堆。篩選就是從乙個結點a出發,先比較這個結點a的左右孩子b c,如果有比其大的結點,交換假設結點c大,那麼將a結點的值調整為c結點的值,接著以c為結點,繼續向下...

關於字串常量的輸出疑惑

我的文章所寫內容,都是自己實際程式設計中遇到的,通常是在遇到這個問題時,在網上搜尋或者自己找到解決辦法。有時候,某些問題要花好久才找的到解決方案,因為網上資料較少,也有可能是我搜尋能力不強。寫下這些,一是希望能幫助到遇到同樣問題的朋友,二是記下之後,再次遇到這些問題,能記得解決辦法。由於平時工作都很...

字串的逆向輸出

比如說給定一字串 i love shanlijuan 那麼它的逆向輸出就是 shanlijuan love i 這裡空白符作為單詞的分割符。方案一 使用標記法,需要乙個快取區。但是比較容易理解,就是逆向掃瞄源字串,把每個單詞正向拷貝到快取區,如下 void reverseword char p st...