• 返回“字符串常量的指针”和“返回数组名”的区别


    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处由于无法拷贝"",无法正确拷贝!

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

  • 相关阅读:
    借鉴文章记录
    三方框架
    常用第三方库记录
    ios block 类型
    ios runtime部分事例方法说明
    ios url网址相关问题解说
    mysql迁移数据库函数中的坑
    mysql的事务隔离级别
    MySQL数据库的默认隔离级别为什么是可重复读
    实时查看mysql连接数
  • 原文地址:https://www.cnblogs.com/Lynn-Zhang/p/5622731.html
Copyright © 2020-2023  润新知