首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当打印传递给glutDisplayFunc()的函数中的全局指针值时,程序退出

当打印传递给glutDisplayFunc()的函数中的全局指针值时,程序退出是因为在函数中使用了一个全局指针,但该指针没有被正确初始化或者指向了一个无效的内存地址,导致程序在访问该指针值时发生了错误,进而导致程序异常退出。

在解决这个问题之前,我们需要了解一些相关概念和背景知识:

  1. GLUT(OpenGL Utility Toolkit)是一个用于编写OpenGL程序的工具库,它提供了一些用于创建窗口、处理输入事件和渲染图形的函数。
  2. glutDisplayFunc()是GLUT库中的一个函数,用于注册一个回调函数,该函数在每次窗口需要重新绘制时被调用。

针对这个问题,我们可以考虑以下几个可能的原因和解决方法:

  1. 全局指针未初始化:在使用全局指针之前,确保它已经被正确初始化。可以在程序的初始化阶段为该指针分配内存空间,并将其指向有效的数据。
  2. 全局指针指向无效内存地址:确保全局指针指向的内存地址是有效的,没有被释放或者已经被其他操作修改。可以通过检查指针的赋值和修改过程,以及确保指针在使用之前没有被释放来解决这个问题。
  3. 全局指针访问越界:确保在访问全局指针指向的数据时没有越界访问。可以通过检查指针的使用范围和访问的数据结构来解决这个问题。
  4. 全局指针被多个线程同时访问:如果程序中存在多个线程,并且全局指针被多个线程同时访问,可能会导致竞争条件和未定义行为。可以通过使用互斥锁或其他线程同步机制来解决这个问题。

总结起来,当打印传递给glutDisplayFunc()的函数中的全局指针值时,程序退出可能是由于全局指针未初始化、指向无效内存地址、越界访问或多线程访问等问题导致的。解决这个问题的关键是确保全局指针的正确初始化和有效性,并避免出现访问错误和竞争条件。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

, 程序退出系统自动释放内存; -- 存放内容 : 全局变量, 静态变量; -- 特点 : 全局变量 和 静态变量存储在一个区域, 初始化两种变量 和 未初始化 存储在不同区域, 但是两个区域是相邻...; 常量区 :  -- 分配, 释放方式 : 退出程序由系统自动释放; -- 存放内容 : 常量; 代码区 (text segment) :  -- 分配, 释放方式 : 编译器分配内存, 程序退出系统自动释放内存...函数参数调用和址调用 (1) 调用 和 址调用 调用 : 以方式将参数传递给函数, 不能直接修改主函数变量, 仅仅是将副本传递给函数; 址调用 : 将 变量指针递给函数..., 函数指针进行操作时候, 主函数也进行了对应变化; 交换函数示例1 :  /********************************************************..., 因此函数执行完毕后, 主函数是不变; -- 址调用 : swap_2 是址调用, 传入是 a , b 两个变量地址 &a, &b, 当在swap_2 中进行修改时候, 主函数

3.9K20
  • C++:07---this指针

    一、this指针介绍 概念:this指针是成员函数一个隐式参数,在类本质上就是对象指针(常量指针) 特点: 在成员函数可通过this指针区别成员变量与形参变量 this可以显式调用 示例代码:...程序被编译之后,此成员函数地址已经确定 我们常说,调用类成员函数,会将当前对象this指针递给成员函数: 上面我们说了,一个类成员函数只定义了一份,所有对象共用这个成员函数体 那么如何区分哪个对象调用此函数呢...这就是this指针作用,每次对象调用成员函数,将this指针(对象首地址)传递给成员函数,然后在函数体内对类数据成员访问,就会被转换为“this->数据成员”形式 如果成员函数内部没有访问对象任何数据成员...,那么进来this指针实际没有任何用处,这样函数全局函数并没有太大区别 演示案例 #include using namespace std; class...结果分析: 此处我们成员函数访问了类数据成员,那么每次打印数据都会通过this指针调用 但是此处我们只创建了一个对象,所以调用pMyClass[1]和pMyClass[10000000]越界了

    39120

    C++:19---this指针

    一、this指针介绍 概念:this指针是成员函数一个隐式参数,在类本质上就是对象指针(常量指针) 特点: 在成员函数可通过this指针区别成员变量与形参变量 this可以显式调用 示例代码:...程序被编译之后,此成员函数地址已经确定 我们常说,调用类成员函数,会将当前对象this指针递给成员函数: 上面我们说了,一个类成员函数只定义了一份,所有对象共用这个成员函数体 那么如何区分哪个对象调用此函数呢...这就是this指针作用,每次对象调用成员函数,将this指针(对象首地址)传递给成员函数,然后在函数体内对类数据成员访问,就会被转换为“this->数据成员”形式 如果成员函数内部没有访问对象任何数据成员...,那么进来this指针实际没有任何用处,这样函数全局函数并没有太大区别 演示案例 #include using namespace std; class MyClass {...结果分析: 此处我们成员函数访问了类数据成员,那么每次打印数据都会通过this指针调用 但是此处我们只创建了一个对象,所以调用pMyClass[1]和pMyClass[10000000]越界了

    52710

    【C语言】卍字通晓→函数+递归

    ---- 调用函数 创建 C 函数,会定义函数做什么,然后通过调用函数来完成已定义任务。 程序调用函数程序控制权会转移给被调用函数。...被调用函数执行已定义任务,函数返回语句被执行时,或到达函数结束括号,会把程序控制权交还给主程序。就像我们上面举例说明代码一样!...printf 函数已提到过,这里从函数调用角度再强调一下。 调用函数,有两种向函数传递参数方式,如下↓ 调用 向函数传递参数调用方法,把参数实际复制给函数形式参数。...址(引用)调用  通过指针传递方式,形参为指向实参地址指针对形参指向操作,就相当于对实参本身进行操作。 ...通过引用传递方式,形参为指向实参地址指针对形参指向操作,就相当于对实参本身进行操作。 传递指针可以让多个函数访问指针所引用对象,而不用把对象声明为全局可访问。

    74910

    9.1 运用API创建多线程

    需要注意,在使用CreateThread创建线程,线程入口函数返回是线程退出码,而不是线程执行结果。...(注:在32位程序下,该默认大小为1MB;在64位程序下,该默认大小为4MB)lpStartAddress:指向线程函数指针,这个函数就是线程执行入口点。...线程启动,系统就会调用这个函数。lpParameter:指定传递给线程函数参数,可以为NULL。dwCreationFlags:指定线程创建标志。通常设为0,表示使用默认。...需要注意是,在使用CreateThread创建线程,线程入口函数返回是线程退出码,而不是线程执行结果。...使用了_beginthreadex创建线程退出,会调用_endthreadex来结束线程,这里返回会被当做线程退出码。

    22020

    【Linux】进程控制

    中保存是最近一个子进程执行完毕退出码,$ 相当于解引用操作。 我们运行起来之后查看它退出结果: 如上图就把 main 函数退出结果打印出来了,其实这个结果就是 main 函数退出码!...错误码通常是衡量一个库函数或者是一个系统调用一个函数调用情况 退出码通常是一个进程退出时候它退出结果 它们共同特点都是,失败时候,来衡量函数、进程出错出错详细原因。...,execvp v 和 p 我们都应该知道是什么意思了,v 可以理解成 vector;p 理解成 PATH;所以第一个参数就是我们需要执行程序;argv 就是各种选项指针数组。...其实我们上面已经做过了,就是使用 putenv 接口新增之后,传递给子进程! 所以通过上面,我们得出结论:程序替换可以将命令行参数和环境变量通过自己参数,传递给被替换程序 main 函数!...out,因为 in 字符最后以NULL结尾,所以没截取到NULL循环继续 54 // 其中 strtok 为截取字符串函数,第一个参数为需要截取字符串,设为NULL,会继续扫描上一次成功调用函数位置

    13010

    9.1 运用API创建多线程

    需要注意,在使用CreateThread创建线程,线程入口函数返回是线程退出码,而不是线程执行结果。...(注:在32位程序下,该默认大小为1MB;在64位程序下,该默认大小为4MB) lpStartAddress:指向线程函数指针,这个函数就是线程执行入口点。...线程启动,系统就会调用这个函数。 lpParameter:指定传递给线程函数参数,可以为NULL。 dwCreationFlags:指定线程创建标志。通常设为0,表示使用默认。...需要注意是,在使用CreateThread创建线程,线程入口函数返回是线程退出码,而不是线程执行结果。...使用了_beginthreadex创建线程退出,会调用_endthreadex来结束线程,这里返回会被当做线程退出码。

    24210

    java参数传递-传递、引用传递

    参数可以是对象引用,而 Java 应用程序是按传递对象引用。 Java 应用程序变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法,处理这两种类型方式是相同。...两种类型都是按传递;没有一种按引用传递。 按传递和按引用传递。按传递意味着将一个参数传递给一个函数函数接收是原始一个副本。因此,如果函数修改了该参数,仅改变副本,而原始保持不变。...按引用传递意味着将一个参数传递给一个函数函数接收是原始内存地址,而不是副本。因此,如果函数修改了该参数,调用代码原始也随之改变。...1、对象是按引用传递 2、Java 应用程序有且仅有的一种参数传递机制,即按传递 3、按传递意味着将一个参数传递给一个函数函数接收是原始一个副本 4、按引用传递意味着将一个参数传递给一个函数...这里有一点要澄清是,这里传对象其实也是,因为对象就是一个指针,这个赋值是指针之间赋值,因此在java中就将它说成了引用。(引用是什么?不就是地址吗?

    4.7K20

    指针变量

    可以使用指针传递或者引用传递。想要在函数体内改变pRes,并把这个变化返回到main函数,必须传递pRes指针。因为pRes本身就是指针,所以应该传递指针指针,或者指针引用。...、引用区别和联系 :实参拷贝传递给形参。...无论还是指针函数都会生成一个临时变量,但引用时,不会生成临时变量, ,只可以引用而不可以改变,但引用时,可以改变指针,只可以改变指针所指内容,不可以改变指针本身,但指针引用时...,既可以改变指针所指内容,又可以改变指针本身, 引用传递函数参数,在内存并没有产生实参副本,它是直接对实参操作;而使用一般变量传递函数参数,发生函数调用时,需要给形参分配存储单元,形参变量是实参变量副本...因此,参数传递数据较大,用引用比用一般变量传递参数效率和所占空间都好。 参考书籍《C陷阱与缺陷》

    2K30

    Python 对函数详细讲解

    如 fun(la),则是将 la 真正传过去,修改后fun外部la也会受影响 python 中一切都是对象,严格意义我们不能说传递还是引用传递,我们应该说不可变对象和可变对象。...b,在传递给 ChangeInt 函数,按方式复制了变量 b,a 和 b 都指向了同一个 Int 对象,在 a=10 ,则新生成一个 int 对象 10,并让 a 指向它。...Age 50 默认参数 调用函数,默认参数如果没有传入,则被认为是默认。...return 语句 return语句[表达式]退出函数,选择性地向调用方返回一个表达式。...局部变量只能在其被声明函数内部访问,而全局变量可以在整个程序范围内访问。调用函数,所有在函数内声明变量名称都将被加入到作用域中。如下实例: 实例(Python 2.0+) #!

    18720

    指针(1)--对于指针基本概念介绍

    +整数 } 打印*(p+i),i作为整数是在不断增加,那么在此基础上指针也会随之增加,在数组上体现就是向前进i。...9.调用和址调用 (1)简析 调用针对对象是函数。 二者顾名思义,一个是传递来调用函数,另一个是传递地址也就是指针来调用函数。...(2)调用 设想:通过调用函数打印调用函数参数被复制到函数形参。这意味着在函数内部对形参修改不会影响到实参。...传递给函数是实参副本也就是临时拷贝,函数内部对形参修改不会影响到实参。...如果我们需要解决这个问题,就需要用到址调用。 结果就是: 在址调用函数参数地址被传递给函数形参。这意味着在函数内部对形参修改会影响到实参

    8510

    C语言线程库使用

    线程退出 在编写多线程程序时候,如果想要让线程退出,但是不会导致虚拟地址空间释放(针对于主线程),我们就可以调用线程库线程退出函数,只要调用该函数当前线程就马上退出了,并且不会影响到其他线程正常运行...另外通过线程回收函数还可以获取到子线程退出传递出来数据,函数原型如下: #include // 这是一个阻塞函数, 子线程在运行这个函数就阻塞 // 子线程退出, 函数解除阻塞...通过打印日志可以发现,在主线程没有没有得到子线程返回数据信息,具体原因是这样: 如果多个线程共用同一个虚拟地址空间,每个线程在栈区都有一块属于自己内存,相当于栈区被这几个线程平分了,线程退出...也就是说在程序 main() 函数,通过指针变量 ptr 或者通过结构体变量 p 都可以读出子线程传出数据。 5....在线程库函数为我们提供了线程分离函数 pthread_detach(),调用这个函数之后指定子线程就可以和主线程分离,子线程退出时候,其占用内核资源就被系统其他进程接管并回收了。

    3.4K30

    丁点而内存知识

    进程只能操作位于物理内存页面。进程引用一个不在物理内存页面,MMU就会产生一个页错误。 内存对此事做出响应,并判断该引用是否有效。...函数启动一个线程,很多时候需要向线程参数,但是线程是异步启动,即很可能启动函数已经退出了,而线程函数都还没有正式开始运行,因此,绝不能用启动函数内部变量给线程参。...道理很简单,函数内部变量在浮动栈,但函数退出,浮动栈自动拆除,内存空间已经被释放了。线程启动,按照给参数指针去查询变量,实际上是在读一块无效内存区域,程序会因此而崩溃。 那怎么办呢?...我们应该直接用malloc函数给需要传递参数分配一块内存区域,将指针传入线程,线程收到后使用,最后线程退出,free释放。...使用内存最容易出现bug是: (1)坏指针错误: 在指针赋值之前就用它来引用内存,或者向库函数传送一个坏指针,第三种可能导致坏指针原因是对指针进行释放之后再访问它内容。

    88640

    指针变量

    可以使用指针传递或者引用传递。想要在函数体内改变pRes,并把这个变化返回到main函数,必须传递pRes指针。因为pRes本身就是指针,所以应该传递指针指针,或者指针引用。...、引用区别和联系 :实参拷贝传递给形参。...无论还是指针函数都会生成一个临时变量,但引用时,不会生成临时变量, ,只可以引用而不可以改变,但引用时,可以改变指针,只可以改变指针所指内容,不可以改变指针本身,但指针引用时...,既可以改变指针所指内容,又可以改变指针本身, 引用传递函数参数,在内存并没有产生实参副本,它是直接对实参操作;而使用一般变量传递函数参数,发生函数调用时,需要给形参分配存储单元,形参变量是实参变量副本...因此,参数传递数据较大,用引用比用一般变量传递参数效率和所占空间都好。 参考书籍《C陷阱与缺陷》

    2.7K40

    轻松拿捏C语言——【保姆级·指针讲解】期末C语言<指针>急救包,全是干货,诚意满满!

    指针成因: 1.指针变量没有初始化 int *p;//局部变量指针未初始化,默认为随机 *p = 20; 规避方法,将指针初始化 不知道指针变量该指向哪里...i<=11; i++) { //指针指向范围超出数组arr范围,p就是野指针 *(p++) = i; } return 0; } 3.指针指向空间被释放掉了 #...把实际参数传递给形式参数,形参会单独创建一个空间来接收实参,因此形参改变对实参没有影响。 所以我们可以将a和b地址传过去,通过地址将a和b交换。...像这样把变量地址传递给函数,这就是址调用。 所以在函数需要改变主调函数变量,我们可以采用址调用;如果仅需要在函数内利用变量来计算,就采用调用。...它是将字符串hello Bao Gengxiaowa.首元素地址即h地址放进指针变量。 用%s打印字符串,只需要首元素地址。

    9910

    全国二级C知识点总结5-函数

    传递,它们占用不是同一存储单元,而且在传递,是单向,由实参向形参。...: (1)被调函数返回是整型或字符型(返回自动按整型处理) (2)被调函数函数定义在主调函数之前 (3)在所有函数定义之前,在函数外预先说明了各个函数类型 例2:(10-09-24)有以下程序...Ø 自动变量(auto) (1)自动变量存储空间是程序执行到定义它函数或语句块才分配,函数执行结束后自动释放,变量也就不再存在。...a传递给形参字符指针s,使s指向字符串“good”;在函数fun对字符串进行遍历,如果指针s指向字符ASCII码是偶数则输出该字符。...主程序指针r指向m,函数调用f(r,&n),实参传递给形参,形参指针p指向m,指针q指向n,*p为m1,*q为n2,所以函数返回为q,返回给主程序指针r,即指针r指向了n,最后输出

    2.1K20

    C语言main函数解析

    main返回 main函数返回用于说明程序退出状态。如果返回0,则代表程序正常退出。返回其它数字含义则由系统决定。通常,返回非零代表程序异常退出。...当然参数传递还可以有其他方式,在下一节,会单独来讲。 main 函数返回类型必须是 int ,这样返回才能传递给程序调用者(如操作系统),等同于 exit(0),来判断函数执行结果。...测试main函数返回意义 前文说到,main函数如果返回0,则代表程序正常退出。通常,返回非零代表程序异常退出。...:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段内容 4.运行全局构造器,类似c++全局构造函数 5.将main函数参数,argc,argv等传递给...atexit函数 原形: int atexit(void (*func)(void));  atexit 函数可以“注册”一个函数,使这个函数将在main函数正常终止被调用,程序异常终止,通过它注册函数并不会被调用

    2.6K88

    【C语言基础】:深入理解指针(二)

    解决办法:我们现在要解决就是调用Swap函数时候,Swap函数内部操作就是main函数a和b,直接 将a和b交换了。...那么就可以使用指针了,在main函数中将a和b地址传递给Swap函数,Swap函数里边通过地址间接操作main函数a和b,并达到交换效果就好了。...,顺利完成了任务,这⾥调用Swap2函数时候是将变量地址 递给函数,这种函数调用方式叫:址调用。...址调用,可以让函数和主调函数之间建立真正联系,在函数内部可以修改主调函数变量;所 以未来函数只是需要主调函数变量值来实现计算,就可以采⽤调用。...如果函数内部要修改 主调函数变量,就需要址调用。

    10310

    【Linux】详谈命令行参数&&环境变量

    main函数第一个参数为argc,参数类型为int,第二个参数为argv,参数类型为char*类型指针数组(也叫命令行参数表),该指针数组以NULL结尾。...当你从命令行运行一个程序时,命令行解释器会负责解析命令行各个部分,包括程序名(即argv[0])和传递给程序任何选项(即argv[1]、argv[2]等)。...解释器还会计算选项数量,并将其作为argc递给main函数。命令行解释器会负责将这些信息正确地传递给程序main函数,以便程序能够使用它们。...所以系统环境变量最初始一定都是保存在磁盘当中一个bash进程启动,再从磁盘读取相应环境变量,在内存形成环境变量表,所以下面讲到export命令是在内存级环境变量表中加入环境变量,不会改变内存环境变量...env表起始地址传递给我们程序main函数env参数,此时我们进程也就拿到了父进程给我们环境变量。

    30010
    领券