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

//下面程序不能输出"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()
{

const char const *k="abcde";
return (char*)&k[0];
}

最后提一句 那个return &k[0];还是写成return k;好了
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-09-30
char k[5];
return &k[0]; 送返的地址是 'char *' 型,不同于 int.
( int aa() 是整型。),语法错。

改 char* aa(); 语法改正了,但因 char k[5];是局部量,首地址值送回来了,但字符串不能正确送回。(5改成21以上 就能正常输出,是偶然)。

char k[5]={"abcde"}; 字符串赋的值的长度 大于 k的声明的长度。字符串有一个看不见的 字符串结束符 "\0", 也要占一个存储单元。

你可以把char k[6] ={"abcde"}; 声明为全局量:

#include "stdio.h"
char k[6]={"abcde"};
char* aa();

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

char* aa()
{
return &k[0];
}

语法和结果都对了。
第2个回答  2009-09-30
#include "stdio.h"
char* aa();

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

char* aa()
{
char* k="abcde";

return k;
}

改了一下,看是不是你要的结果,原来k[5]不对应该是越界了,字符串默认在最后有'\0',占一个字符的位置,所以"abcde"实际上占6个字符,还有既然你函数返回值是int,那你返回的确是&k[0],数组地址?,汗。
第3个回答  2009-09-30
你这程序语法有问题。。。
#include "stdio.h"
char* aa();

void main()
{

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

char* aa()
{
static char k[7]={"abcde"};

return &k[0];

}
这是正确的写法 。
说明:你所用的k[5]={"abcde"};数组越界,并且局部数组永远也不可能被main()函数访问到,因为函数生命周期结束,数组就被销毁了
第4个回答  2009-09-30
1.char k[5]={"abcde"}----字符数组在最后一位字符后面还有1个结束符号'\0',所以这里应当改成k[6];
2.return &k[0]---这样写返回的是字符a,而这个函数要返回k这个数组,直接返回数组首地址就行,即return k;
3.int a()---既然返回的是1个char类型数组,那么函数类型就应当与char类型数组地址相对应,所以声明和定义部分2个地方的int aa()都应当改成char* aa()
第5个回答  2009-09-30
k是aa的局部变量,只在aa返回前有效。这里不管出于什么原因你能正常打印出字符串都不能代表程序正确——必然不是所有编译器编译的结果都能正常执行。能打印出字符串只是因为你使用曾经的k的内容的时候,新的数据还没有把它覆盖掉。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网