关于C语言中回调函数的问题!!

路飞-总裁 2009-10-15 06:20:34
纯C,VS2005下运行如下代码:(其中函数musicopentimer也为静态的)
static void MediaNotify(void * pUser, AEEMediaCmdNotify * pCmdNotify)
{
CApp * pMe = (CApp *)pUser;
if (pCmdNotify->nCmd != MM_CMD_PLAY)
return;

switch(pCmdNotify->nStatus) {
case MM_STATUS_START:
break;
case MM_STATUS_ABORT:
case MM_STATUS_DONE:
if(IMEDIA_Play(pMe->m_pMedia) != SUCCESS)
{
ISHELL_SetTimer(pMe->a.m_pIShell,0,(PFNNOTIFY)musicopentimer,pMe);
}
else
{
ISHELL_CancelTimer(pMe->a.m_pIShell,(PFNNOTIFY)musicopentimer,pMe);
}
}
}
以上代码运行时一切正常,但我在程序中加入如下代码,运行至该函数尾时会报如下错误,
Run-Time Check Failure #2 - Stack around the variable 'nVolume' was corrupted.
static void MediaNotify(void * pUser, AEEMediaCmdNotify * pCmdNotify)
{
CApp * pMe = (CApp *)pUser;
if (pCmdNotify->nCmd != MM_CMD_PLAY)
return;

switch(pCmdNotify->nStatus) {
case MM_STATUS_START:
break;
case MM_STATUS_ABORT:
case MM_STATUS_DONE:
if(IMEDIA_Play(pMe->m_pMedia) != SUCCESS)
{
ISHELL_SetTimer(pMe->a.m_pIShell,0,(PFNNOTIFY)musicopentimer,pMe);
}
else
{
ISHELL_CancelTimer(pMe->a.m_pIShell,(PFNNOTIFY)musicopentimer,pMe);
}
}
{
uint16 nVolume;
int nError;
nError = IMEDIA_GetVolume(pMe->m_pMedia, &nVolume);
DBGPRINTF_FATAL("nError = %d, nVolume = %d", nError, nVolume);
}
}
根据错误提示,我在变量nVolume和nError之前分别加上了static,这样运行的时候就没有问题了。
上面两个变量加上static之后该变量是在程序运行前分配空间,并不是函数中的临时变量。


请问以上两个变量不能使用局部非静态的临时变量是因为该函数是静态函数的原因还是回调函数的原因呢?为啥不能直接使用?
...全文
549 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
路飞-总裁 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wireless_com 的回复:]
getvolume 是有单独的事件处理的呀
[/Quote]

能不能说详细点啊。
  • 打赏
  • 举报
回复
getvolume 是有单独的事件处理的呀
儿大不由爷 2009-10-15
  • 打赏
  • 举报
回复
处理栈里的空间有越界的吧
1) 本套课程针对高校大学生系统学习C语言而录制,从0基础入门讲起,循序渐进,通俗易懂,同时适用于计算机系及非计算机系的同学。通过学习可以帮助大家掌握C语言本质,轻松面对C语言全国二级考试,并达到能独立完成型C项目、C游戏的水平;2) 多数高校都开设了C语言课程,网上C语言课程也很多,但普遍存在两个问题: (1) 授课方式单一,大多是照着代码念一遍, 对刚刚接触编程的同学来说,感觉晦涩难懂 (2) 授课内容过度注重语法,没有项目实战支撑,造成课程枯燥无趣。本课程针对上述问题进行了改进 (1) 授课方式采用语法讲解+内存布局示意图+项目的方式,让课程生动有趣好理解 (2) 系统全面的讲解了C语言的核心技术点,还配套录制了《全国计算机二级C语言真题精讲》,让学员在掌握C语言编程的同时,还能轻松面对二级考试;3) 课程详细内容: 常量-变量、分支语句、循环语句、操作符和表达式、函数(库函数、自定义函数、递归调用 )、数组(一维数 组、二维数组、数组作为函数参数、指针数组)、指针(指针和指针类型、二级指针和多级指针、指针表达式解析、指针运算、数 组指针、函数指针、回调函数)、调试技巧、程序环境和预处理(翻译环境、运行环境、预定义符号、#define和#undef、宏和函 数、条件编译、文件包含)、 数据在内存的存储、内存块分配、static、字符函数和字符串函数、自定义类型(结构体、枚举 、联合)、动态内存管理、文件操作(i/o常量、i/o函数、流)。

933

社区成员

发帖
与我相关
我的任务
社区描述
为开发者提供高通丰富的解决方案及全面技术下载内容。本版以AI人工智能、WoS移动笔记本、XR、IoT 物联网、Auto 汽车、生成式AI等核心板块组成,为开发者提供一个便捷及高效的学习交流平台。
人工智能物联网机器学习 企业社区 北京·东城区
社区管理员
  • Qualcomm开发
  • csdnsqst0050
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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