不錯
值傳遞不會傳遞動態記憶體,址傳遞才會傳遞動態記憶體。注意:值傳遞(任何時候,引數傳遞都是拷貝形式);址傳遞是傳遞本身(記憶體),值傳遞傳遞替身。
#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...