程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 返回“字符串常量的指針”和“返回數組名”的區別,常量數組

返回“字符串常量的指針”和“返回數組名”的區別,常量數組

編輯:C++入門知識

返回“字符串常量的指針”和“返回數組名”的區別,常量數組


char*getmemory(void)
{
    char p[]=”hello world”;
    return p;
}
void test(void)
{
    char *str=NULL;
    str=getmemory(); printf(str);
}

  問:運行Test 函數會有什麼樣的結果?

由於數組p是棧上數據,返回數組名就是返回棧內存即動態數據區的地址,函數結束會被釋放,所以返回的地址也就指向了不確定的位置了,str就成了亂碼!

如果改成:

char*getmemory(void)
{
    char *p=”hello world”;
    return p;
}
void test(void)
{
    char *str=NULL;
    str=getmemory(); printf(str);
}

  就可以正確的輸出了,原因是返回字符串常量的指針,返回的就是靜態數據區(常量區)的地址,可以正確打印!

 再看一題:

問:如下程序用於輸出“Welcome to Huawei Test”,請指出其中的兩處錯誤。

char * GetWelcome(void){
    char * pcWelcome;
    char * pcNewWelcome;
    pcWelcome="Welcome to Huawei Test";
    pcNewWelcome=(char *)malloc(strlen(pcWelcome));    //1
    if(NULL==pcNewWelcome){
        return NULL;        //2
    }
    strcpy(pcNewWelcome, pcWelcome);    //3
    return pcNewWelcome;            //4
}

  有的人可能覺的答案是1和4,認為返回棧內存的地址,除了函數就會被釋放,這顯然是錯誤的!

正確答案是1和3

第1處沒有給"\0"分配內存,第3處由於無法拷貝"\0",無法正確拷貝!

由於該函數返回的是常量區的地址,所以正確打印是可以的!

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