GetMemory函式的幾種經典考法

2021-06-02 09:11:20 字數 1675 閱讀 4081

void getmemory(char *p)

int main(int argc, char *argv)

str沒有得到分配記憶體的位址值。

記憶體空間狀態:首先申請了四個位元組的棧空間,存放str指標,此時str的值為0,存放str的這塊記憶體的位址值為0x0012ff7c。呼叫函式 getmemory,指標p入棧,也分配了四個位元組的棧空間,p被賦str的值即此時p的值也為0,存放指標p的記憶體位址是0x0012ff2c。然後將新開闢的100個位元組的記憶體空間位址賦給p,此時p的值為0x00372b70。函式呼叫結束時str的值仍為0,str並沒有得到那塊100個位元組的記憶體空間位址值!

**2:

void getmemory(char **p)

int main(int argc, char *argv)

str可以得到分配記憶體的位址值。

記憶體空間狀態:首先申請了四個位元組的棧空間,存放str指標,此時str的值為0,存放str的這塊記憶體的位址值為0x0012ff7c。呼叫函式 getmemory,指標p入棧,也分配了四個位元組的棧空間,此時p是乙個二級指標,存放了指標str的位址值,即p的值是0x0012ff7c,存放指標p的記憶體空間的位址值是0x0012ff2c。然後將新開闢的100個位元組的記憶體空間位址值0x00372b70賦給*p,即str,所以str的值為 0x00372b70。函式返回時str的值為分配的100個位元組的記憶體空間的位址!

**3:

void getmemory(char **p)

int main(int argc, char *argv)

str不能得到分配記憶體的位址值,程式crash。

如果在getmemory函式中使用如下語句 p = (char*)malloc(100); 會出現編譯出錯,原因是不能將乙個二級指標指向分配的記憶體空間位址。如果使用強制轉換 p = reinterpret_cast(malloc(100)); 編譯可以通過,但是會造成程式崩潰。

**4:

void getmemory(char *p)

int main(int argc, char *argv)

str不能得到分配記憶體的位址值,編譯出錯。將乙個指標的位址值傳給了一級指標,非法!

void getmemory1(char *p)

void test1(void)

//str一直是空,程式崩潰

char *getmemory2(void)

void test2(void)

char *getmemory3(void)

void test3(void)

//test3 中列印hello world,因為返回常量區,而且並沒有被修改過。test2中不一定能列印出hello world,因為指向的是棧。

void getmemory4(char **p, int num)

void test4(void)

//記憶體沒釋放

void test5(void)

}//str為野指標,列印的結果不得而知

void test6()

}//vc斷言失敗,執行錯誤

GetMemory函式的幾種經典考法

試題4 void getmemory char p void test void 試題5 char getmemory void void test void 試題6 void getmemory char p,int num void test void 試題7 void test void 解答...

GetMemory函式的幾種經典考法

試題4 void getmemory char p void test void 試題5 char getmemory void void test void 試題6 void getmemory char p,int num void test void 試題7 void test void 解答...

GetMemory函式詳解

include include include using namespace std char getmemory char p,int num int main void getmemory錯誤講解 指標練習 錯誤程式 void getmemory char p void test void 這...