一个非常简单的返回局部字符数组的C语言程序, 请问其输出结果?

以下是该无聊的程序:

#include <stdio.h>
#include <string.h>

char* get_str()
{
    int x[10];
    char str[] = "hello world! long long long long long long long!!!";
    return str;
}

int main()
{
    char a[256];
    char* str = get_str();
    strcpy(a, str);
    printf("str=%s\n", a);
    return 0;
}

 

问程序的程序输出结果是啥?

我相信大多数人都会觉得这个题有点BUG, 返回了局部数组, 程序无法预料. 事实确实是这样.

但就算事实就摆在眼前, 你仍然可以拿编译器试试他们的输出结果:

比如: VS2012 + VC6.0 + GCC4.7 在DEBUG模式下的输出结果均是正确的:

hello world! long long long long long long long!!!

 

你们知道是什么原因吗? ^^^^

如果你了解一点汇编, 那么你可能知道, 函数返回时可能只是一个简单的add esp,x

如果你只是无脑地认为 "局部数组" 函数返回后就 "消失" 了的话, 我也无法可说了.

 

2014-06-08 23:27:28 更新:

  哈哈, 无独有偶, 我居然在StackOverflow看到了一篇非常类似的文章 : Can a local variable's memory be accessed outside its scope?

  这个问题得到了微软资深软件工程师 Eric Lippert 的最佳答案.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值