C 指標記憶體

2022-04-07 08:38:01 字數 1435 閱讀 1297

這是乙個關於c++指標的問題,思考了一下

void getmemory(char *p, int num){

p = (char*) malloc (sizeof(char) * num);

void test(void) {

char *str = null;

getmemory(str,100);//str 仍為null 

strcpy(str, "hello");  //執行錯誤

這個p等同於指標值傳遞,只是將p的值傳遞進去,然後申請記憶體

編譯器會為函式每個引數製作臨時副本,p的副本_p = p;

如果函式體修改了_p的內容,就導致p的內容也相應修改。

如果不修改_p,p也不變。反而每執行一次就洩露一塊記憶體。

void getmemory2(char **p, int num){

*p = (char*)malloc(sizeof(char) * num);

void test2(void){

char *str = null;

getmemory(&str,100);//引數是&tr

strcpy(str,"hello");

cout這是使用指向指標的指標來申請記憶體的,理解參考:

這裡p相當於指向了str,p申請了記憶體就相當於str申請了記憶體,個人覺得有點難理解

char *getmemory3(int num){

char *p = (char*)malloc(sizeof(char) * num);

return p;

void test3(void){

char *str = null;

str = getmemory3(100);

strcpy(str,"hello");

cout這個就是在堆中申請了一段記憶體,然後返回給str,對於堆,棧,靜態區的理解參考:

在getmemory3中free(p)後,程式還是可以執行的,所以個人覺得free()釋放記憶體是程式執行解釋之後的,而不是馬上就在函式執行是釋放

參考:char *getstring(void){

char p = "hello world";

return p;//編譯器出錯

void test4(void){

char *str = null;

str = getstring();//亂碼

cout《返回的p被系統**了,所以是野指標。因為這裡是棧申請的儲存空間。

char *getstring2(void){

char *p = "hello world";

return p;

void test5(void){

char *str = null;

str = getstring2();

cout對指標又加深了一點點了解

參考於: c++高質量程式設計指南

C 和記憶體指標

雖然到了.net 的runtime 時代,c 仍然是不可磨滅的主要支柱,包括在msdn 裡見到的api 大部都是有指標型別存在,那麼在以c 冠首的c 裡應當如何去使用指標呢?其實,c 裡可以直接使用結構型的變數引用進api,但是畢竟它不是指標在對一些涉及以結構陣列存放的記憶體區操作可能就力有不及了,...

C 和記憶體指標

c 和記憶體指標 關 鍵 詞 serverword.net 雖然到了.net 的runtime 時代,c 仍然是不可磨滅的主要支柱,包括在msdn 裡見到的api 大部都是有指標型別存在,那麼在以c 冠首的c 裡應當如何去使用指標呢?其實,c 裡可以直接使用結構型的變數引用進api,但是畢竟它不是指...

C指標申請記憶體

include struct abc typedef struct abc abc void fun1 abc a,abc b void fun2 abc a main 輸出結果 12 15 如果通過指標申請記憶體的話,就需要用到指標的指標,在林銳博士的文章中提到編譯器會為每個函式的引數最乙個備份,...