C语言函数返回值--为什么设置的字符数组大小会出错.

来源:百度知道 编辑:UC知道 时间:2024/05/24 14:00:54
//下面程序不能输出"abcde"......把

#include "stdio.h"
int aa();

main()
{
printf("%s",aa());
}

int aa()
{
char k[5]={"abcde"};
//把5改成21以上 就能正常输出,为什么???

return &k[0];
}
希望大家在编译环境里试验下再回答------主要是讨论下原理和问题所在
别拘束,只当讨论,学习....

kaithinking, mhl1003: 把5改成6是不行的,这就是我奇怪的地方,
BlueWanderer:函数立刻就返回输出一般不会被覆盖的....而且多次试验都存在这种情况....vc中也存在
L_o_o_n_i_e :使用公共变量就非我本意了,
luofan9: 函数类型返回什么都一样,用过c的都知道
Legend258:的代码能返回我要的,我的

如果用作 dll输出函数时候 输出 字符串....该如何用呢
我们继续讨论.....

先写个基本情况的

#include "stdio.h"
char* aa();aa的返回类型用来printf("%s",aa());输出 可见应该是char*类型
int main()
{
printf("%s",aa());
return 0;
}

char* aa()
{

char k[]="abcde";//k是个局部数组 初始化为abcde还有个\0
当返回式 该局部数组被收回 k指向还在 但是内同没有了
return &k[0];
}

////////上面说的 楼上几位也说了~////////拓展下~~
1.把char k[]="abcde";定义成全局就不说了~
定义成全局会让数据分散,在只能用C不用C++的环境里构造类似对象的情况是会很糟。

2.char k[]="abcde";//既然在返回的时候被收回 那不让他收回的就行了

程序改成
char* aa()
{

static char k[]="abcde";//把k数组变成static数组 这样返回是k的内容依然保留
return &k[0];
}

除了static之外 还用种常用的方法。

char* aa()
{

char *k="abcde";//这里只定义了一个K指针 而k指向了abcde
abcde我是const区的常量,不属于局部变量,被收回的只有k而已。
return &k[0];
}

上面的写法其实存在不安全因素 实际上它是隐式的const声明,那就把它补全
char* aa()