函数返回值,有点迷糊了

yyy6210 2007-10-26 03:29:21
关于函数返回局部变量的问题,怎么越学越乱了感觉,谁理一下。

哪些局部变量的值可以返回,为什么?

int test()
{
int i = 3;
return i;
}

这个应该可以
---------------------------------
char* test()
{
char ch[5] = "1234";
return ch;
}

这个应该不行
--------------------------------
char *strdup(const char *str)
{
char *p;
if(p = malloc(strlen(str)+1))
strcpy(p, str);

return p;
}
这个可以
------------------------------------
...全文
117 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyy6210 2007-10-26
  • 打赏
  • 举报
回复
这句:不过,如果用static申明静态变量的话,该变量也会被放在堆内,不会因函数返回而销毁。

静态变量应该放在内存的静态变量区吧~~~~~
Benny_ywb 2007-10-26
  • 打赏
  • 举报
回复
en
bamboostflying 2007-10-26
  • 打赏
  • 举报
回复
静态变量没有放在堆内吧!
GuiltyGear 2007-10-26
  • 打赏
  • 举报
回复
楼主要仔细理解一下变量作用域的概念。
如果你返回一个指针指向某个局部变量,但是函数返回后该局部变量就要销毁,那么就有可能产生意想不到的问题。
malloc分配的内存在堆上,不会随着某个函数退出而释放。但是调用函数的时候,局部变量被放在了栈内,函数返回时,栈指针回复,那片内存就被销毁了。不过,如果用static申明静态变量的话,该变量也会被放在堆内,不会因函数返回而销毁。
bamboostflying 2007-10-26
  • 打赏
  • 举报
回复
int test()
{
int i = 3;
return i;
}

这个可以,因为返回的是值,虽然函数调用后i就无效了,但是你用其他的变量保存了函数返回值就可以用了

---------------------------------
char* test()
{
char ch[5] = "1234";
return ch;
}

这个不行 ,引文ch[5]是定义在栈上的变量,函数调用结束后变量内存回收了。如果再引用,有可能得到的是乱码
--------------------------------
char *strdup(const char *str)
{
char *p;
if(p = malloc(strlen(str)+1))
strcpy(p, str);

return p;
}
这个可以,因为分配的是堆内存,函数调用结束不负责自动回收,分配的存储空间还是有效,但是记得一定要在外面释放,否子内存泄露
bamboostflying 2007-10-26
  • 打赏
  • 举报
回复
to yuanwenbin

char* test()
{
char ch[5] = "1234";
return ch;
}

这个不行
这不就是返回栈上的指针吗
Benny_ywb 2007-10-26
  • 打赏
  • 举报
回复
char* test()
{
char ch[5] = "1234";
return ch;
}

这个可以

不能返回指向栈上的指针
最近,正在忙基于三汇语音卡的呼叫中心的项目,真的好迷糊啊!公司在呼叫中心这方面的研发是空白,所有的资料都得从零开始收集,分析,上网查找一些前辈们的技术资料,在这里备个份,好好学习一下! --------------------------------------------------------------------------------------------------------------------- 随着语音技术的不断发展,语音卡在通信行业应用非常广泛。本节通过几个典型实例介绍语音卡程序的开发。 说明-1 实例428 语音卡电话呼叫系统 实例说明 随着科学技术的不断发展,语音卡被广泛地应用于商业软件中。本例实现了利用语音卡实现电话呼叫的功能。实例运行结果如图13.12所示。 说明-2 技术要点 本例采用东进公司开发的8路模拟语音卡,该卡采用灵活的模式化设计,可按需配置外线、内线两种模块。该语音卡可实现坐席、会议、FSK数据收发、语音合成等多种功能,并提供SDK开发工具包。 在安装完驱动程序后,相应的动态链接库(NewSig.dll和Tc08a32.dll文件)会复制到Windows的系统目录下。在语音卡的开发过程中,主要通过调用NewSig.dll和Tc08a32.dll来实现相应的功能。下面介绍这两个动态库中的主要使用函数。 (1)LoadDRV函数函数用于加载动态链接库。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern long LoadDRV(); 返回值返回值为0表示成功;?1表示打开设备驱动程序错误。?2表示在读取TC08A-V.INI文件时发生错误;?3表示INI文件的设置与实际的硬件不一致时发生错误。 (2)FreeDRV函数函数用于关闭驱动程序。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern long EnableCard(short wusedCh, short wFileBufLen); (3)EnableCard函数函数用于初始化语音卡硬件,并为每个通道分配语音缓冲区。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern long EnableCard(short wusedCh, short wFileBufLen); 参数说明如下。 l wUsedCh:标识通道数量。 l WFileBufLen:标识分配的缓冲区大小。 (4)CheckValidCh函数函数检测在当前机器内可用的通道总数。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern short CheckValidCh(); l 返回值:通道总数量。 (5)CheckChType函数函数用于测试某个通道的类型。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern short CheckChType(short wChnlNo); 参数说明如下。 l wChnlNo:标识通道号。 l 返回值:为0表示内线;为1表示外线;为2表示悬空。 (6)PUSH_PLAY函数函数用于维持文件录放音的持续进行,需在处理函数的大循环中调用。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void PUSH_PLAY(); (7)SetBusyPara函数函数用于设置要检测的挂机忙音的参数。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern void SetBusyPara(short BusyLen); 参数说明: l BusyLen:标识忙音的时间长度,单位为毫秒。 (8)RingDetect函数函数用于测试外线是否振铃或内线是否提机。语法如下: [DllImport("Tc08a32.dll", CharSet = CharSet.Auto)] public static extern bool RingDetect(short wChnlNo); 参数说明如下。

69,376

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧