C 语言

根据指针获取所申请内存的实际大小 (C/C++)

副标题:根据指针获取malloc空间大小

前言:

有时候程序出现coredump时,需要知道是所申请的内存空间被程序自身越界访问导致,还是双次释放导致。但不太好排查,这里提供一种思路。

一. 为什么free/delete不需要知道所申请空间大小?

C或C++在申请空间时,实际上会申请比预期更多的空间,一部分是因为对齐需要,也可能是刚好有那么一块内存可以满足条件,还有另一个原因是在所申请内存首部存了额外的信息占据了一点空间,该首部其中一部分信息便是该指针对应申请空间的大小。

我们可以看下Glibc实现下该首部的组成结构,其中存储申请空间大小的信息便是mchunk_size变量:

当然,不同的库实现方式可能不同。

二. 由于库版本存在差异,怎么确定所申请空间大小信息在首部前第几个字节

1.复制如下代码到 chunkSizeTst.cpp

2.编译

3.运行

可能会发生segmentation fault,但无所谓,能拿到我们要的结果即可

4.分析输出

Continue reading...

Gtk 修改GtkLabel、GtkEntry等的文本颜色,添加下划线,更改字体大小等相关属性

代码如下,将Widget传进函数即可,之后相关属性会相应改变.

详情见注释

也可以进一步封装,根据widget类型,自动调整逻辑,同时适应Entry和Label等的属性设置:

Continue reading...

C语言sleep不起作用

原因如下:

sleep() causes the calling thread to sleep either until the number of real-time seconds specified in seconds have elapsed or
until a signal arrives which is not ignored.

sleep有两种情况会被打破,一是时间已经到了,二是有信号来临

所以sleep提前终止肯定是被什么信号中断的,检查一下再做个应对措施即可。

 

RETURN VALUE
Zero if the requested time has elapsed, or the number of seconds left to sleep, if the call was interrupted by a signal han‐
dler. ( 如果定时时间已经过了,sleep返回0,如果sleep被中断,则返回剩余定时时间 )

 

根据sleep的返回值,可以用如下方法实现:

 

 

Continue reading...

记录一次奇怪的段错误经历

背景

GTK编程,在函数内部定义了一个结构体,作为指针传递给其他函数,在其他函数内部调用结构体内部成员变量,发现有一个成员变量总是为空,另外一个不会。

 

原因

定义结构体的位置在回调函数内部,回调函数运行完成后,结构体所在内存即被回收。

然而有时候在一定时间内回收内存里的数据没有发生改变,所以有些结构体的成员变量还是能够正常获取。

但是在执行其他指令的时候,原结构体部分成员变量的内存会被重用,造成内部数据改变,再去调用的时候,得到的就是完全随机的数据,如果把它当做指针使用,它指向的内存是未知的,未被申请的,再去操作这段内存就会发生段错误。

 

解决办法:

将结构体定义成 static 类型,让他在程序的整个生命周期内有效,不会被回收。

Continue reading...

Gtk searchEntry 无法输入英文文本

–Gtk searchEntry 无法输入文本可能原因

 

检查是否捕获了 key-press-event,然后又没有 return TRUE,这将导致发生键盘点击事件时,执行完对应回调函数后信号没有再继续传递,没办法被searchEntry捕获,也就没有办法继续输入文本了。

Continue reading...

Gtk TextView 如何去除白色背景框

Gtk TextView在某些情况下显示的文字会有白色的背景框,显得跟界面格格不入,如下图所示:

上图的源码如下:

Continue reading...

Gtk 创建可自由拖拽、移动的按钮

— Gtk draggable button example c codes

示例代码如下:

命名:dragButton.c

Continue reading...

Gtk获取窗口内光标 | 指针 | 鼠标的绝对和相对坐标,绝对和相对位置

获取指针绝对坐标和窗口内的相对坐标

 

方法一:直接调用函数获得

详情见注释,注意window变量来自 Gtkwidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 代码中没有给出

方法二: 注册回调函数获得

Continue reading...

Linux 安装glfw3及glad的C语言库

一. 安装GLAD头文件及动态库

 

二. 安装glfw3库

Arch+x11直接安装glfw-x11,其他版本桌面服务器的请再自行网上查阅

 

三. 实例

Continue reading...