代碼1:
void GetMemory(char *p)
{
p = (char*)malloc(100);
}
int main(int argc, char *argv[])
{
char *str = NULL;
GetMemory(str);
strcpy(str, "Hello");
return 0;
}
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)
{
*p = (char*)malloc(100);
}
int main(int argc, char *argv[])
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "Hello");
return 0;
}
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)
{
// 這條語句編譯出錯,將一個二級指針指向分配的地址了
// p = (char*)malloc(100);
// 可以使用強制轉換,但程序crash
p = reinterpret_cast<char**>(malloc(100));
}
int main(int argc, char *argv[])
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "Hello");
return 0;
}
str不能得到分配內存的地址值,程序crash。
如果在GetMemory函數中使用如下語句 p = (char*)malloc(100); 會出現編譯出錯,原因是不能將一個二級指針指向分配的內存空間地址。如果使用強制轉換 p = reinterpret_cast<char**>(malloc(100)); 編譯可以通過,但是會造成程序崩潰。
代碼4:
void GetMemory(char *p)
{
p = (char*)malloc(100);
}
int main(int argc, char *argv[])
{
char *str = NULL;
GetMemory(&str); // 這條語句會編譯出錯,將一個指針地址值傳給了一級指針
strcpy(str, "Hello");
return 0;
}
str不能得到分配內存的地址值,編譯出錯。 將一個指針的地址值傳給了一級指針,非法!
void GetMemory1(char *p)
{
p = (char *)malloc(100);
}
void Test1(void)
{
char *str = NULL;
GetMemory1(str);
strcpy(str, "hello world");
printf(str);
}
//str一直是空,程序崩潰
char *GetMemory2(void)
{
char p[] = "hello world";
return p;
}
void Test2(void)
{
char *str = NULL;
str = GetMemory2();
printf(str);
}
char *GetMemory3(void)
{
return "hello world";
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3();
printf(str);
}
//Test3 中打印hello world,因為返回常量區,而且並沒有被修改過。Test2中不一定能打印出hello world,因為指向的是棧。
void GetMemory4(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test4(void)
{
char *str = NULL;
GetMemory3(&str, 100);
strcpy(str, "hello");
printf(str);
}
//內存沒釋放
void Test5(void)
{
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
//str為野指針,打印的結果不得而知
void Test6()
{
char *str=(char *)malloc(100);
strcpy(str, "hello");
str+=6;
free(str);
if(str!=NULL)
{
strcpy(str, "world");
printf(str);
}
}