首页
学习
活动
专区
工具
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++:19---this指针

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

    53310

    C++:07---this指针

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

    39820

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

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

    76310

    C++类和对象(5)static修饰的静态成员变量&函数

    1.静态成员函数和静态成员变量的引入 (1)我们通过以下面的这个例子逐步引出静态的成员变量和成员函数: 我们自己定义一个类,使用这个类创建对象,我们应该如何判断在这个程序执行的过程中,创建了多少个对象,...,3个是默认的函数,1个就是我们自己定义的func函数,当执行默认构造函数和拷贝函数的时候,就让nm都加加,当执行析构函数的时候,就让m--,说明已经有一个对象被销毁了;最后再打印输出nm的数值; (4...)在这个过程中,我们有3组打印输出的结果,我们知道 m打印的结果一直都是2,说明正在使用的对象就是2个,n打印的结果在变化,说明一直有对象被创建; (5)第一次的打印结果两个2很容易理解, 创建2个对象...因为我们调用了func这个函数,a1这个实参传递给aa这个形参执行拷贝构造函数,这个时候需要创建对象,而且返回的时候,因为是传值返回,我们需要创建一个对象作为临时变量,所以又要创建一个对象,综上所述,一共是创建了...因为我们在这个地方给的缺省值是传递给了初始化列表的,初始化列表是对对象进行初始化的,但是我们这里的静态成员变量是属于这个类的,不会走初始化列表的,所以就不应该给缺省值; (3) 我们在类里面声明静态的成员变量

    9310

    Linux:线程控制

    成功返回0;失败返回错误码(pthreads函数出错时不会设置全局变量errno(而大部分其他POSIX函数会这样做)。...2.4 线程函数参数返回值为啥都是void* 以往进程返回是通过返回错误码来告知我们错误信息,可以线程中的函数为什么会是void*呢?? 因为不止可以传整形、字符串……还可以传类对象!!...如果我们主线程要传类对象给次线程,就必须在堆区开辟空间,这样虽然td指针被释放了,但是我们可以通过args把这个指针传递给线程,这样每个线程就可以去访问自己在堆中的对象了!...如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源。 ...,但其实其他线程想要访问在技术角度也是可以做到的(定义一个全局的指针,然后在某一个线程中让他保存其中的一个局部变量的地址,然后主线程再当全部线程创建完成之后,再去查看这个全局的指针变量),因为线程与线程之间几乎没有秘密

    12110

    【Linux】进程控制

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

    15110

    9.1 运用API创建多线程

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

    23320

    9.1 运用API创建多线程

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

    26610

    【Linux】从零开始手搓 Shell (超详解)

    一个函数可以调用另外一个函数,同时传递给它一些参数。被调用的函数执行一定的操作,然后返回一个值。每个函数都有他的局部变量,不同的函数通过call/return系统进行通信。...这种通过参数和返回值在拥有私有数据的函数间通信的模式是结构化程序设计的基础。Linux鼓励将这种应用于程序之内的模式扩展到程序之间。 一个C程序可以 fork/exec另一个程序,并传给它一些参数。...(2)外部命令是 linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。...父进程执行命令的时候,定义一个全局最近进程退出时的退出码,每一个子进程执行结束,获取子进程退出信息并且更新退出码,echo以内建命令的形式打印出来,因此 ?...就相当于 shell 中的全局变量 具体操作 -- 实现内建命令 echo 的操作 + 全局变量作退出码 // 全局变量 -- 保存命令退出时的退出结果 int lastcode = 0; bool

    21710

    深度刨析C语言中的动态内存管理

    malloc申请空间,申请到后直接返回这块空间的起始地址,不会初始化空间的内容 malloc申请的内存空间,当程序退出时,还给操作系统。...当程序不退出,动态申请的内存不会主动释放,需要使用free函数来释放 C语言还提供了另一个函数,专门用来做动态内存的释放和回收的。...在test函数中我们创建了一个str指针指向NULL,然后就直接把指针变量传入getmemory函数中,这里的传参是传值调用,对p的修改是不会影响到str的也就造成了,在strcpy函数中对NULL指针解引用的错误...5.C/C++程序的内存开辟 C/C++程序内存分配的几个区域: 1.栈区(stack):在执行函数时,函数内局部变量的储存单元都可以在栈上创建,函数执行结束时,这些储存单元自动被释放。...2.堆区(heap):一般由程序员分配释放,若程序员不释放,会在程序结束时由操作系统回收。分配方式类似于链表 3.数据段(静态区)(static)存放全局变量、静态数据。

    6710

    java中的参数传递-值传递、引用传递

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

    4.7K20

    C语言指针

    解引用相当于顺着指针保存的地址,找到指针指向对象的值。 2. 指针类型决定了在进行解引用操作时访问的空间大小。...= NULL);//报错,退出程序 } #define NDEBUG #include 传值调用和传址调用 1....传址调用,可以让函数和主调函数之间建立真正的联系,在函数内部可以修改主调函数中的变量。 2. 如果函数中只是需要主调函数中的变量值来实现计算,就可以采用传值调用; 3....如果函数内部要修改主调函数中的变量的值,就需要传址调用。 传值调用 1. 实参传递给形参的时候,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实参。...将main函数中将a和b的地址传递给Swap函数,Swap 函数里边通过地址,间接操作main函数中的a和b,达到交换的效果。

    3800

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

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

    10410

    指针变量的传值和传址

    可以使用指针传递或者引用传递。想要在函数体内改变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+) #!

    20420

    Linux:进程替换

    ——>其实这个过程非常简单粗暴,就是当该进程运行到exec系列的代码时,就会把拿ls这个可执行程序的代码和数据来粗暴地替换自己的代码和数据 ,当然这个过程可能会存在空间的申请和释放。...——>因为有写时拷贝技术的存在,所以父子进程能够保持自己的独立性,在这个过程中一开始父子进程指向相同的代码和数据,但是当子进程一旦执行了exec系列的函数,操作系统检测到子进程想要修改这些数据,所以发生了写时拷贝...加载器的理解: argv这个参数会被传递给ls,其实exec系列接口含义也是如此,在命令行参数中,有所的进程都是bash的子进程,所以exec其实就是一个代码级别的加载器,他可以做到将可执行程序的代码和数据导入到内存中...,然后再调用main函数的时候将argc参数传递给程序,其实就相当于是你在执行该程序之前,优先给你加载出来一个栈帧结构。...,所以表里面存的是指针,本质上是一个指针数组, 所以我们如果将字符串信息保留在栈帧中,那么当被释放的时候就找不到这个环境变量了,因此我们必须单独维护一段空间  环境变量是你在shell启动的时候从用户目录底下的配置文件读取的

    13410

    C语言线程库的使用

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

    3.4K30

    丁点而内存知识

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

    89240
    领券