美文网首页
老生常谈,C语言变量生存周期

老生常谈,C语言变量生存周期

作者: 止愚至善 | 来源:发表于2017-01-11 16:07 被阅读0次
假设创建线程的接口如下
/*
@param[in]:
        char *pThreadName                 线程名称

        int nPriority                     优先级

        int nStackSize                    线程栈空间

        ThreadEntry fnThreadEntry         线程入口函数(函数指针)

         void *pAry                       入口函数的参数

@param[out]:
         ThreadHandle                     线程句柄
*/
ThreadHandle  threadCreate(char *pThreadName, int nPriority, int nStackSize, ThreadEntry fnThreadEntry, void *pAry);

创建线程调用的过程可能如下:

int init(void)

{
       HANDLE handle = creatHandle();//某个会生成句柄的函数
       ThreadHandle  threadHandle =  threadCreate("myThreadName", 10, 10*1024, fnProcess, (void*)&handle);//创建线程,handle 句柄线程作为入口函数的参数
        // do something
}

void fnProcess(void *pAry)
{
         if(!pAry)
         {
              return;
         }
         HANDLE  hCurHandle= * (HANDLE  *)pAry;
        //do something
}

发现创建线程时,传入的参数(void)&handle,与入口函数接收到的参数pAry是匹配的;但是强制转换后HANDLE hCurHandle= * (HANDLE *)pAry;得到的hCurHandle不等于传入的handle
强制转换的前后地址都是对的,但是取值的结果不一样,遇到这个问题,刚开始以为是强制转换导致的,后面才往变量声明周期上考虑,HANDLE handle是一个栈变量,当函数 int init(void)执行完毕,该变量的内存空间会被销毁,因此创建线程时传入的(void*)&handle其实是一个野指针,导致void fnProcess(void *pAry)中得到的地址貌似是对的,实则地址上的内容不合法,也就是获取到不确定的错误句柄hCurHandle

这个问题比较隐蔽,实则是老生常谈的变量生命周期的问题。
可以这样处理,创建线程时直接将 handle强转为 (void *)handle传入,线程处理函数接收到参数后直接强转为HANDLE hCurHandle= (HANDLE)pAry,这样得到的handle就是正确的了。

相关文章

  • 老生常谈,C语言变量生存周期

    假设创建线程的接口如下 创建线程调用的过程可能如下: 发现创建线程时,传入的参数(void)&handle,与入口...

  • OC

    变量的存储类别 C语言根据变量的生存周期来划分: 静态存储方式是指在程序运行期间分配固定的存储空间的方式。静态存储...

  • C语言中变量存储类别

    敬畏知识, 重新出发. C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式。 静态存储方式:是指在...

  • C语言中变量存储类型和生存周期

    转载,详见原文:https://blog.csdn.net/wuyuzun/article/details/824...

  • iOS开发技能树之C语言-存储方式、类别

    存储方式 C语言根据变量的生存周期来区分,分为静态存储方式和动态存储方式。 静态存储方式:在程序运行期间分配固定存...

  • C语言学习笔记

    C语言变量的作用域和生命周期: 自动变量 auto int a; (auto可以省略) 外部变量,外部函数 ex...

  • C语言变量存储

    C语言中的变量按照生存周期来区分,可以分为静态存储和动态存储。一、静态存储静态存储是在程序运行过程中分配固定的存储...

  • C语言基础教程之存储类

    编程中变量还有生命长短?C语言四种不同的存储类变量 存储类定义C程序中变量和/或函数的范围(可见性)和生命周期。它...

  • C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别

    一直对C语言中的各种变量有点模糊,终于找到了一个比较完整的说明. 1.C++变量根据定义的位置的不同的生命周期,具...

  • 栈基础知识

    1.C语言变量的分布 : C 语言有全局变量(Global)、本地变量(Local),静态变量(Static)、寄...

网友评论

      本文标题:老生常谈,C语言变量生存周期

      本文链接:https://www.haomeiwen.com/subject/khdrbttx.html