C有關記憶體的思考題

2021-07-06 00:04:44 字數 1049 閱讀 9439

void getmemery(char *p)

void test()

int main()

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

下面是在windows下vs2013編譯器的結果:程式崩潰

因為getmemory方法並不能傳遞動態記憶體!test函式中的str一直都是null;strcpy將使程式崩潰

之所以不能傳遞動態記憶體,是因為在使用指標作為引數傳遞進另外乙個函式的時候,如果在這個函式中修改了指標引數的位址,原來的指標還是不變的,因為在函式中呼叫另外乙個函式並且將指標作為引數進行傳遞時,會將原來的指標複製乙份,並且將這個副本當做實參傳遞進test函式,並且將其壓進函式棧,在test函式中所進行的修改位址的操作只會修改指標副本的位址,對原來的指標是不會有影響的!正如乙個經典的swap函式

swap(int

*a,int

*b)

如果用上面這段程式來對兩個數進行交換的話,那麼是不會成功的,注意我是用的乙個指標型別的temp,相當於在swap函式中修改了a,b的位址,所以根據上面所說的原理,是不能交換兩個數的,如果想要交換,那麼將temp的型別改為int型別,而不是int指標型別,就ok。

如果想要在函式體內修改指標的位址,不能直接修改指標的位址,而應該傳入乙個指標型別的引用或者指標的指標,兩者都是二級指標,就像下面這段**!

#include 

#include

using

namespace

std;

//直接在指標上分配動態記憶體,不可取,程式崩潰

void getmemory(char *p)

//使用指標型別的引用來作為引數進行傳遞,這樣是可行的,輸出helloworld

void getmemory2(char *&p)

//使用指標的指標來進行引數的傳遞,這樣也是可行的,輸出helloworld

void getmemory3(char **p)

void test()

int main()

有關記憶體的思考題

摘自 高質量c c 程式設計指南 四 有關記憶體的思考題 20 分 void getmemory char p p char malloc 100 void test void char str null getmemory str strcpy str,hello world printf str...

有關記憶體的思考題

void getmemory char p void test void 請問執行test 函式會有什麼樣的結果?因為 getmemory 並不能傳遞動態記憶體,test 函式中的 str 一直都是 null。strcpy str,hello world 將使程式崩潰。2.char getmemor...

有關記憶體的思考題

注意下面4個測試函式的執行結果 測試函式1 void getmemory char p void test void 執行結果 程式崩潰。因為getmemory並不能傳遞動態記憶體,test函式中的str一直都是null。strcpy str,hello world 將使程式崩潰。測試函式2 cha...