首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于返回char指针的函数解决方法

2013-11-23 
关于返回char指针的函数1.下面函数返回的局部变量str数组的地址,所以在调用的地方打印乱码是可以理解的。不

关于返回char指针的函数
1.下面函数返回的局部变量str数组的地址,所以在调用的地方打印乱码是可以理解的。
   不理解的是,为什么重复调用后,都会正常显示。
   而且我在调用的地方用一个char指针接收sub_int函数返回值竟然也等于返回时pch的值,不理解。



char *sub_int(int x,int y)
{
char str[256];
char *pch = str;
memset(str,0,sizeof(str));
snprintf(str,sizeof(str),"sub_int(%d,%d)",x,y);

return pch;
}

2.main函数

int main()
{
int x,y;
x=5;
y=2;
printf("%s\n",add_int(x,y));
printf("%s\n",add_int(x,y));

return 0;
}

3.运行结果第一行乱码,之后都正常显示:
??$!
add_int(5,2) 指针
[解决办法]
返回局部变量的内存地址,只要以后这块内存系统不占用,那里面的值就不会改变,你第一行返回了乱码,说明在函数返回后系统占用了这块内存,改变了里面的值,之后正常显示,则系统一直没有占用,但无法保证在将来的某个时刻不占用。


其实函数返回局部变量的地址没有什么不可,它属于进程地址空间中的合法内存,因此我们可以放心的使用,之所以不提倡这样做,是因为我们不知道系统何时会占用这块内存并导致里面的值改变,
[解决办法]
栈内的数据随时可以被改变,这样做是不可预料的,只是碰巧有正确的结果而已,深究下去没有意义。


引用:
1.下面函数返回的局部变量str数组的地址,所以在调用的地方打印乱码是可以理解的。
   不理解的是,为什么重复调用后,都会正常显示。
   而且我在调用的地方用一个char指针接收sub_int函数返回值竟然也等于返回时pch的值,不理解。


char *sub_int(int x,int y)
{
char str[256];
char *pch = str;
memset(str,0,sizeof(str));
snprintf(str,sizeof(str),"sub_int(%d,%d)",x,y);

return pch;
}

2.main函数

int main()
{
int x,y;
x=5;
y=2;
printf("%s\n",add_int(x,y));
printf("%s\n",add_int(x,y));

return 0;
}

3.运行结果第一行乱码,之后都正常显示:
??$!
add_int(5,2)

[解决办法]
 char str[size];
这个问题取决于你的size是多少 要深入考虑你这个char str申请的空间在哪了 怎么存的连续的?
局部变量的数组 str的内存存放 什么时候会释放 什么时候不释放
当size为一定值时 可能出现三种都打印
三种都不打印
乱码等可能
[解决办法]
打印出来只是碰巧
[解决办法]
引用:
1.下面函数返回的局部变量str数组的地址,所以在调用的地方打印乱码是可以理解的。
   不理解的是,为什么重复调用后,都会正常显示。
   而且我在调用的地方用一个char指针接收sub_int函数返回值竟然也等于返回时pch的值,不理解。


char *sub_int(int x,int y)
{
char str[256];
char *pch = str;
memset(str,0,sizeof(str));
snprintf(str,sizeof(str),"sub_int(%d,%d)",x,y);

return pch;
}

2.main函数

int main()
{
int x,y;
x=5;
y=2;
printf("%s\n",add_int(x,y));
printf("%s\n",add_int(x,y));

return 0;
}

3.运行结果第一行乱码,之后都正常显示:
??$!
add_int(5,2)


返回局部指针地址是危险的!因为它的生命周期到函数调用结束也就结束了!
返回偶尔能获取到有效数据,只是说明数据没有及时擦除而已!但是结果还是不可预知的!

[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

热点排行