none
函数内部定义问题讨论 RRS feed

  • 常规讨论

  • char* GetString1()

    {

        char p[] = "Hello World";

        return p;

    }

     

    char* GetString2()

    {

        char *p = "Hello World";

        return p;

    }

     

     

    int _tmain(int argc, _TCHAR* argv[])

    {

        printf("GetString1 returns: %s. \n", GetString1());

        printf("GetString2 returns: %s. \n", GetString2());

     

        return 0;

    }

    答案输出两行,第一行GetString1 returns: 后面跟的是一串随机的内容,而第二行GetString2 returns: Hello World. 两个函数的区别在于GetString1中是一个数组,而GetString2中是一个指针

    当运行到GetString1时,p是一个数组,会开辟一块内存,并拷贝"Hello World"初始化该数组。接着返回数组的首地址并退出该函数。由于pGetString1内的一个局部变量,当运行到这个函数外面的时候,这个数组的内存会被释放掉。因此在_tmain函数里再去访问这个数组的内容时,结果是随机的

    当运行到GetString2时,p是一个指针,它指向的是字符串常量区的一个常量字符串。该常量字符串是一个全局的,并不会因为退出函数GetString2而被释放掉。因此在_tmain中仍然根据GetString2返回的地址得到字符串"Hello World"

     

    看了上边的内容以后,个人感觉有些迷惑,在函数内部定义变量是经常的事,但是有没有其他的情况呢?其他的类型会不会随着函数体的结束,内存释放呢?如函数体内定义的结构、类、各种指针等,怎样解决这些变量的返回值问题?希望大家补充

    2011年3月16日 3:01

全部回复

  • 面对这个我问题,我再网上也找了找,面对返回值为指针时,可以使用malloc(sizeof(类型))在系统的静态存贮区里分配了4个字节的内存空间。malloc函数返回一个指针值,该指针就是上述4个字节的首地址。free(指针)释放指针所在的内存块,这种形式。还有其他方法吗?
    2011年3月16日 3:09
  • char p[] = "Hello World"; 相当于

    char p[] = {'H','e','l','l','o',' ','W','o','r','l','d'};

    2011年3月16日 4:05
  • char p[] = "Hello World";

    师初始化一个字符数组。

     char *p = "Hello World";

    是一个指向常量字符串的指针。常量字符串是包括\0的。而那个数组则不包括。


    麻烦把正确答案设为解答。
    2011年3月16日 14:26
    版主