首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从函数返回char*和char[]有什么区别?

从函数返回char*和char[]有什么区别?
EN

Stack Overflow用户
提问于 2017-09-07 15:38:09
回答 1查看 5.5K关注 0票数 69

为什么第一个函数返回字符串"Hello,World“,而第二个函数什么也不返回。我认为这两个函数的返回值都是未定义的,因为它们返回的数据超出了作用域。

代码语言:javascript
复制
#include <stdio.h>
// This successfully returns "Hello, World"
char* function1()
{
    char* string = "Hello, World!";
    return string;
}
// This returns nothing
char* function2()
{
    char string[] = "Hello, World!";
    return string; 
}

int main()
{
    char* foo1 = function1();
    printf("%s\n", foo1); // Prints "Hello, World"
    printf("------------\n");
    char* foo2 = function2(); // Prints nothing
    printf("%s\n", foo2);
    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2017-09-07 19:20:45

当用C或其他基于堆栈的语言编写代码时,需要记住的一件非常重要的事情是,当一个函数返回时,它(及其所有的本地存储)都会消失。这意味着,如果你想让其他人能够看到你的方法的辛勤工作的结果,你必须把它放在你的方法停止后仍然存在的地方,要做到这一点,你需要理解C语言在哪里存储东西以及如何存储东西。

你可能已经知道数组是如何在C中运行的,它只是一个内存地址,随着对象的大小递增,你可能也知道C不做边界检查,所以如果你想访问十个元素数组的第11个元素,没有人会阻止你,只要你不试图写任何东西,就没有什么坏处。您可能不知道的是,C语言将这种思想扩展到使用函数和变量的方式。函数只是按需加载的堆栈上的一块内存区域,其变量的存储空间只是该位置的偏移量。您的函数返回了一个指向局部变量的指针,具体地说,就是堆栈上保存'Hello World\n\0‘的'H’的位置的地址,但是当您调用另一个函数( print方法)时,print方法会重用该内存来执行所需的操作。您可以很容易地看到这一点(不要在生产代码中这样做!)

代码语言:javascript
复制
char* foo2 = function2(); // Prints nothing
ch = foo2[0];  // Do not do this in live code!
printf("%s\n", foo2);  // stack used by foo2 now used by print()
printf("ch is %c\n", ch);  // will have the value 'H'!
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46090597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档