zoukankan      html  css  js  c++  java
  • 返回“字符串常量的指针”和“返回数组名”的区别

    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处没有给""分配内存,第3处由于无法拷贝"",无法正确拷贝!

    由于该函数返回的是常量区的地址,所以正确打印是可以的!

  • 相关阅读:
    第一次站立会议
    构建之法阅读笔记03
    软件工程概论学习进度条03
    四则运算三
    构建之法阅读笔记02
    软件工程概论学习进度条02
    四则运算二
    构建之法阅读笔记01
    软件工程概论学习进度条1
    软件工程个人作业01
  • 原文地址:https://www.cnblogs.com/Lynn-Zhang/p/5622731.html
Copyright © 2011-2022 走看看