程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> GetMemory 函數解析,getmemory函數解析

GetMemory 函數解析,getmemory函數解析

編輯:關於C語言

GetMemory 函數解析,getmemory函數解析


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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved