GetMemory函數解析

代碼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);
    }
}

發佈了57 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章