![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
HW_Coder0501
I'm QXK, from ZJUT.
展开
-
linux gdb反汇编定位问题
从汇编指令可看出,加载补丁后在原函数基础上加了8字节的偏移,补丁的原理就是在原来函数基础上加上跳转,到补丁函数地址执行,之所以是8字节,因为ldr指令和br各占4字节,总共是8字节,这也是为什么有些函数太小就无法做补丁的原因,因为函数本身大小没有达到汇编跳转指令的大小。日前解决一现网问题遇到补丁加载未生效现象,想要验证流程是否走进补丁代码,由于补丁函数和原函数名称一样,且修改代码较少,通过普通gdb方法难以看出是否走进补丁,但可用gdb反汇编方法来验证。原创 2023-12-18 12:27:31 · 162 阅读 · 0 评论 -
C/C++语言的安全编码规范
安全编码的内容非常广泛,涉及变量、断言、函数、循环、异常机制、类、安全退出、字符串/数组操作、整数、内存、不安全函数、文件输入/输出、敏感信息处理等各方面,这里简略叙述最重要的内存、函数、字符串处理等几个模块,以期能达到举一反三作用,引导大家树立安全编码思想。通过函数参数传递数组或一块内存进行写操作时,函数参数必须同时传递数组元素个数或所传递的内存块大小,否则函数在使用数组下标或访问内存偏移时,无法判断下标或便宜的合法范围,产生越界访问的漏洞。3、通过防御性的编码策略来弥补潜在的编码人员的疏忽。原创 2023-12-11 00:07:24 · 390 阅读 · 0 评论 -
C++11新特性
long long类型:长整型,占8字节,可表示范围-2^63 ~ 2 ^ 63 - 1。要使用long long 类型的整数必须标注对应的后缀:对于有符号的long long 类型,后缀用"LL"或者"II"标识,就比如"10LL"就表示有符号超长整数10。对于无符号的long long 类型,后缀用"ULL"或者"UII"标识,就比如"10ULL"就表示无符号超长整数10。原创 2023-11-19 19:00:23 · 41 阅读 · 0 评论 -
C语言指针强转的本质
该函数里面先是将传入的指针强转为了pub_head_t类型,之后又偏移了该结构体大小的位置,继续读取值,看到这里我产生了一丝疑问,传入的指针指向某块内存,该块内存数据被强制转换为了pub_head_t结构体类型,那么该内存块的大小应该就是该指针类型的大小,为什么后面又偏移了sizeof(pub_head_t)去读取数据?C语言指针类型强转的本质是,原指针指向的内存数据类型会被转换为所转换指针的类型,其范围是该指针类型的大小,而不是原指针指向的整块内存。其中的结构体变量类型如下。原创 2023-11-16 21:40:45 · 211 阅读 · 0 评论 -
函数指针用法详述
在编译器进行编译时,会为程序中的函数分配一段存储空间,用于存放函数,该存储空间位于内存的代码段,它的首地址就称为函数的地址,函数名表示的也是这个地址。既然是地址,我们就可以定义一个指针变量来表示它,这个指针变量就是函数指针。指针变量如何定义?虽然同样是指向一个地址,但指向函数的指针变量同指向变量的指针变量的定义方式不同。函数指针的定义方式如下:这个语句就定义了一个指向函数的指针变量 p。原创 2023-02-02 20:26:56 · 231 阅读 · 0 评论 -
qsort排序结构体数组
【代码】qsort排序结构体数组。原创 2022-09-18 15:31:20 · 235 阅读 · 0 评论 -
深入理解linux下write()和read()函数
1、write()函数定义:ssize_t write (int fd, const void * buf, size_t count);函数说明:write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。返回值:如果顺利write()会返回实际写入的字节数(len)。当有错误发生时则返回-1,错误代码存入errno中。附加说明:(1)write...原创 2017-05-13 20:09:11 · 199272 阅读 · 21 评论 -
leetcode编程题:合并两个有序链表
难度:简单输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4限制:0 <= 链表长度 <= 1000题解如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct List原创 2021-07-23 12:29:02 · 213 阅读 · 1 评论 -
位域结构体在内存中的存放方式
如下原创 2021-08-06 16:35:11 · 527 阅读 · 0 评论 -
结构体的一种经典初始化方法
C语言中结构体初始化的异类方法,如下strut Data { int year; int month; int day;};struct Data data = { .year = 2000, .month = 1, .day = 1};Linux内核源码中这种初始化方法较为常见。原创 2022-03-19 20:09:38 · 176 阅读 · 0 评论 -
C语言空字符‘\0‘在字符数组中的存储浅析
空字符'\0',也即结束符,对应的二进制为0000 0000(对应十进制为0),而字符'0'对应的二进制为0011 0000(对应十进制为48)。几种'\0'的常用用法:1、字符数组不指定大小初始化char str[] = {"123"};或char str[] = {'123'};实际上数组str在内存中的存放情况为: 1 2 3 \0以上,编译器会在数组最后自动加上'\0'结束符。2、字符数组不指定大小,但以单引号括字符char str[] = {'1','2','3'原创 2021-12-11 21:11:34 · 2979 阅读 · 0 评论 -
C语言bool类型
bool类型true 为1,false为0原创 2021-12-03 11:47:09 · 1706 阅读 · 0 评论 -
error: initializer element is not constant
1、背景C语言编译错误:error: initializer element is not constant,出错代码如下: char *info = (char *)malloc(len); static char *info_t = info;这里试图用malloc分配的内存指针初始化一个静态变量,导致了上述错误。2、出错原因static变量为全局变量,全局变量的值不能在编译时确定,而是在运行时确定(编译原理),所以这里不能直接在声明时初始化全局变量。改为如下:原创 2021-08-31 11:55:45 · 1734 阅读 · 0 评论 -
字符串数组名和字符串常量指针作函数返回值的区别
有如下代码在子函数GetMemory要获取字符传“hello world”并将其返回, 有两种方式,一种是用数组承载字符串,并将数组名返回;一种是用字符串常量指针承载字符串,并将指针返回。两种方式中,第一种将不能实现将字符串返回的目的,因为GetMemory()中定义的字符串数组是局部变量,函数运行完成后被回收,返回局部变量的地址,最后指向的是不确定的内容。而第二种的字符串常量则是存在于常量区,函数运行结束不被回收,所以可以返回。...原创 2021-08-17 15:35:07 · 277 阅读 · 0 评论 -
二级指针误用引起的段错误
有如下两段代码:int main(){ int *p1; int **p2; int a = 10; *p2 = &a; //段错误 **p2 = 20; printf("p1 = %d, a = %d \n", p1, a);}和int main(){ int *p1; int **p2; int a = 10; p1 = &a; *p2 = &a; **p原创 2021-07-21 22:37:23 · 230 阅读 · 0 评论 -
C语言中的数组与指针出参
1、通过指针出参操作数组的错误用法和正确方法如下有两种通过出参方式获取子函数内存数据的方法。其中第一种为很多C语言初学者常用的错误方法。以上两种方式中,第一种通过填入一级指针的方式操作malloc分配的内存;第二种通过二级指针的方式操作malloc分配的内存,两种操作外部数组的方法得到的结果截然不同。(1)第一种方法中,妄图通过对函数array_test1()传入指针pArr1,得到函数中分配的内存空间的数据,实际上这种使用方法是错误的。如下:在C语言中,函数的形参和实参各有一个地址原创 2021-05-15 18:13:10 · 1088 阅读 · 0 评论 -
一文搞清楚sizeof和strlen的用法和区别
1、关于数组做sizeof的参数不退化,传递给strlen就退化为指针的正确理解sizeof操作的对象为指针时,得到的结果是指针的大小(32位系统为4字节)。但对象为数组时,得到的结果是整个数组的大小。但有一种情况除外,参看2。2、数组名做形参传递给sizeof时将会退化为指针这时的sizeof运算的结果又变成了对指针计算大小的结果。3、strlen函数用来计算字符串中字符的个数strlen只能用来计算字符数组的大小,不能计算其他类型数组大小。实际使用中常常有人会误用来计算int类.原创 2021-05-14 23:25:49 · 1077 阅读 · 6 评论 -
linux下编译c++程序遇到 error: ‘thread’ is not a member of ‘std’的错误
今天用c++写了一个socket网络编程,用g++ client.c -o client 命令编译时出现“client.c:69:5: error: ‘thread’ is not a member of ‘std’ std::thread(RMsg).detach();” 的错误,在网上搜索原因,看到了一个外国论坛上老外给出的答案:" To get g++ into C++11原创 2016-12-29 11:29:41 · 15724 阅读 · 2 评论 -
单链表反转
参考http://blog.csdn.net/feliciafay/article/details/6841115。单链表的反转有多种方法,这里实现我认为最容易理解,效率也颇高的一种,即用三个指向不同结点的指针来完成链表逆置。算法代码实现如下:void reverseLinkList(LinkList *list) { LinkList p, q, r; p = *list; q原创 2017-12-29 15:48:26 · 550 阅读 · 0 评论 -
删除单链表中指针q指向的结点
题目:有一个非空单链表list,每个结点中存放一个整型数据。 指针q指向链表中某一个结点,编写函数delLink,删除q指向的结点。链表定义如下:typedef struct node{ElemType data; //数据域struct node *next; //指针域}LNode, *LinkList;分析:原创 2017-12-28 21:50:12 · 3969 阅读 · 3 评论 -
编程实现两个有序单链表的合并
实现两个单链表的合并就是将多个原链表的结点进行重新组合排列,重组成一个新的链表。可以采用下面算法实现,这里list1和list2都是按值递增的序列。LinkList MergeList(LinkList list1, LinkList list2) { LinkList list3; LinkList p = list1, q = list2; LinkList r; if (原创 2017-12-29 14:21:15 · 4503 阅读 · 0 评论 -
error: ISO C++ forbids declaration of 'CPageConfigMail' with no type
编译C++程序出现错误:error: ISO C++ forbids declaration of 'CPageConfigMail' with no type出现这个问题原因不一,最有可能的是头文件忘记包含。解决方法:在.h文件中包含类CPageConfigMail的头文件;并加入class CPageConfigMail;一行代码(或只加入头文件也可),即可。...原创 2019-03-23 16:42:45 · 1255 阅读 · 0 评论 -
C语言二维数组内存申请及初始化方法
(一)类内部的成员变量:普通的变量:是要占用内存的,但是要注意对齐原则(这点和struct类型很相似)。 static修饰的静态变量:不占用内容,原因是编译器将其放在全局变量区。(二)类内部的成员函数:普通函数:不占用内存。 虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的,和虚函数的个数是没有关系的。需要注意:一个空类,如下所示......原创 2021-07-01 21:05:29 · 3786 阅读 · 0 评论