c
文章平均质量分 50
只要代码敲得好,BUG就追不到我
让世界变得更美好
https://github.com/liusenlindegithub
展开
-
Linux C/C++代码调试之深入熟悉使用GDB
Coredump文件是什么?1.1 产生根因1.2 如何打开?1.3 如何设置文件名以及路径GDB理论部分2.1 基本命令2.2 被忽略但实用的命令2.3 实用的GDB设置GDB操作部分3.1 coredump文件是否任何时候都产生?3.2 系统函数是否可以打印coredump信息?3.3 调试案列(基本使用)3.4 调试案列(多进程)3.5 调试案列(多线程以及线程锁问...原创 2020-04-24 12:56:14 · 985 阅读 · 4 评论 -
深入探究 Linux C中进程崩溃
目录前言栈内存异常以及案列分享堆内存异常以及案列分享Ptmalloc的内存管理前言LinuxC的内存管理融入了设计者很多高效的算法和思想,提供了用户直接可以操作的内存的“指针”,这也是其他语言不涉及的(除Go语言21世纪的C语言),但是对于指针这把双刃剑,开发者操作着进程的内存,难免造成意想不到的崩溃问题,其实踩内存情况应该把栈和堆(ptmalloc)分开,因为linux对这两块的管理...原创 2020-04-23 22:10:08 · 1583 阅读 · 4 评论 -
Linux线程栈空间内存从glibc源码分析
1.何为线程栈空间泄露? 2. 何为anon内存? 3. 虚拟内存、物理内存、anon内存的联系 4. anon与线程的联系 5. glibc源码库线程创建与销毁anon关系 6. 使用pmap分析虚拟地址空间以及anon内存原创 2020-02-20 13:10:26 · 1410 阅读 · 1 评论 -
strtok()函数的实现
小结字符串处理函数: 1.注意字符串的特征,末尾’\0’ 2.遍历是最常见的,如果一个字符串中查询另一个 一定要分清谁在前后的问题strtok函数对于字符串的切割,很好用的。 分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。作用于字符串s,以包含在deli原创 2016-07-29 22:08:17 · 3122 阅读 · 5 评论 -
strbrk()函数的设计
#include<iostream>#include<stdio.h>#include<assert.h>char *my_strbrk(const char *src1,const char *src2);char *my_strbrk(const char *src1,const char *src2){ assert(src1 != NULL && src2 != NULL);原创 2016-07-29 18:43:12 · 1155 阅读 · 0 评论 -
strdup()函数实现
#include<iostream>#include<stdio.h>#include<assert.h>char * my_strdup(char *src);char *my_strdup(char *src){ if(NULL == src) { return NULL; } char *p_src = NULL; p_src =原创 2016-07-29 17:25:40 · 3884 阅读 · 0 评论 -
strcat()和strncat()函数的实现
#include<iostream>#include<stdio.h>#include<assert.h>char *my_strcat( char *des,const char *src); char *my_strcat( char *des,const char *src){ assert(des != NULL || src != NULL); char *ad原创 2016-07-29 15:57:04 · 784 阅读 · 0 评论 -
编写类似strcmp() strncmp()函数
#include<iostream>#include<stdio.h>#include<assert.h>int my_strcmp(const char *str1,const char str2); int my_strcmp( const char *str1,const char *str2){ assert(str1 != NULL || str1 != NULL原创 2016-07-27 18:15:39 · 1014 阅读 · 0 评论 -
strchr()查找字符串首次出现字符‘X’的位置
#include<iostream>#include<stdio.h>#include<assert.h>char * my_strchr(char *str,char x); char * my_strchr( char *str,char x){ assert(str != NULL); for(;*str != x;str++) { if(*原创 2016-07-27 17:59:03 · 1177 阅读 · 0 评论 -
strncpy()
#include<iostream>#include<stdio.h>#include<assert.h>char * my_strncpy( char *des,const char src,size_t len);char * my_strncpy( char *des,const char *src,size_t len){ assert(des != NULL && src原创 2016-07-27 17:32:50 · 691 阅读 · 0 评论 -
字符串拷贝函数strcpy()
#include<iostream>#include<stdio.h>char * my_strcpy( char *des,const char src);char * my_strcpy( char *des,const char *src){ if(NULL == src || NULL == des) { return NULL; } ch原创 2016-07-27 17:19:43 · 2949 阅读 · 0 评论 -
找字符串中第一个只出现一次的字符
#include<iostream>#include<stdio.h>char find_fir_repeat_char(const char *str);char find_fir_repeat_char(const char *str){ if(NULL == str) { return '\0'; } const char *p_str原创 2016-07-27 16:53:37 · 745 阅读 · 0 评论 -
strstr()的实现
#include<iostream>#include<stdio.h>int my_strstr(const char *src,const char *des);int my_strstr(const char *src,const char *des){ if(NULL == src || NULL == des) return -1; const c原创 2016-07-27 16:10:56 · 549 阅读 · 0 评论 -
指针
指针: 指针就是地址,指针值就是地址值。指针变量就是存放指针的变量,所以一定不要将指针与指针变量搞混淆了。指针仅仅是一个地址值,而指针变量就是存放指针(也就是地址的变量)指针的定义:例如整型指针: int *p;p是一个指向int类型数据的指针变量。里面存放的地址(也就是指针)是一个int类型变量的地址。指针变量时有类型的,例如p原创 2016-06-12 23:50:01 · 390 阅读 · 0 评论 -
计算机中的原码、反码、补码(下)
在数学中, 是将正号“+” 和负号“ -”放在绝对值前面来表示该数是正数还是负数的。 而在计算机中则使用符号位来表示正、负数。 符号位规定放在数的最前面, 用“ 0”表示正号, “ 1” 表示负号, 其余位仍表示数值( 2进制表示) 。 在计算机中, 数有3种表示方法:原码、 补码、 反码。原码表示法:表示方法: 原码表示方法中, 数值用绝对原创 2016-06-08 10:41:19 · 1956 阅读 · 0 评论 -
Linux下的动态库与静态库的制作
Linux下静态库和动态库的制作与使用 Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。linux系统有几个重要的目录存放相应的函数库,如/lib (32位机)和/usr/lib64(64计算机)。 静态函数库: 这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易原创 2016-05-27 23:10:36 · 581 阅读 · 0 评论 -
运算符中的几个陷阱
原创 2016-05-27 22:37:10 · 781 阅读 · 0 评论 -
运算符优先级小结
运算符总结运算符+ - * / % > = 以及各种复合赋值运算符要求两边的操作数类型一致,条件运算符?:要求后两个操作数类型一致,这些运算符在计算之前都需要做 Usual Arithmetic Conversion(类型转换)下面按优先级从高到低的顺序总结一下 C 语言的运算符,每一条所列的各运算符具有相同的优先级,对于同一优先级的多个运原创 2016-05-27 21:52:26 · 2010 阅读 · 0 评论 -
进程中的“段”
进程中的段 前言: 现代计算机操作系统都采用段页式管理方式,即对每个进程分配一个虚拟的内存空间,将程序调入内存中,进行加载,bss 段:BSS 段(bsssegment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文 BlockStarted by Symbol的简称。BSS段属于静态内存分配。data 段:数据原创 2016-05-26 21:45:34 · 650 阅读 · 0 评论 -
Linux 下的man page
Man PageMan Page 是 Linux开发最常用的参考手册,由很多页面组成,每个页面描述一个主题,这些页面被组织成若干个Section。FHS(FilesystemHierarchy Standard)标准规定了Man Page 各Section 的含义如下:表 3.1. Man Page的 Section描述Section1 用户命令,例原创 2016-05-26 12:44:44 · 795 阅读 · 0 评论 -
统计字符串中有‘0’——‘9’的字符个数
#include<iostream>using namespace std;int Cllcdigital(char *str){ if(NULL == str){ return 0; } int i = 0; int size = 0; int count[256] ={0}; char *sd = NULL; sd =原创 2016-07-15 15:33:59 · 4279 阅读 · 0 评论 -
二维数组的遍历练习
#include#include#includeint main (int argc,char *argv[]){int m;int n;int i;int j;int t; int x = 0;int index ;int d[20][20];scanf("%d",&n);for(i = 0;i {for(j =0 ;原创 2016-05-27 21:50:38 · 730 阅读 · 0 评论 -
宏和内联函数的小结
内联函数和宏 宏定义是C语言提出的,它在预处理的地方将代码展开,这样做,相比于函数调用,可减少额外的时间和空间开销。 但是宏定义有一些缺点,最明显的是,它容易产生二义性。如:#define MAX(a, b) a>b?a:b 使用该宏: MAX( num1, num2 ,因为宏展开后变成 num1>num2 ?num1:num2,但是,如果是这样调用的:MAX( 17+32, 25+21)原创 2016-08-09 12:19:51 · 582 阅读 · 0 评论 -
函数的退出码
void exit(int status); void _Exit(int status); int atexit(void (*function)(void)); 函数功能介绍如下: void exit(int status) 该函数终止调用的程序。status传递给系统用于父进程恢复。程序退出之前,exit()调用所有以a原创 2016-07-19 16:32:36 · 802 阅读 · 0 评论 -
c++中的六大缺省函数
#include<iostream>#include<stdio.h>using namespace std;class TEST{ public: TEST &fun(TEST sd) { int temp; temp = sd.get_data() ; TEST原创 2016-07-04 21:40:18 · 1213 阅读 · 0 评论 -
while(1) 与for(;;) 的区别
一、 背景今天在网上看到一篇blog,文章题目是《C代码优化方案》,其中有一节说到while(1)和for(;;)两种无线循环,哪种效率更高?但是,在现代编译器上,其实两种无线循环效率都是一样的。二、 以前为什么会出现for(;;)比while(1)的无线循环的效率高呢?在《C代码优化方案》中,这样写道:在编程中,我们常常需要用到无限循环,常用的两种方法是while (1) 和 for (转载 2016-06-16 23:59:43 · 1732 阅读 · 0 评论 -
二维数组的深度解剖
小结: int a[3][2]; a 的值 = a[0]的值= a[0][0]的地址 a +1 = a[0] +1 a 的地址 由系统分配 &a 指整个二维数组#include#includeusing namespace std;int main (){原创 2016-06-13 17:27:58 · 782 阅读 · 0 评论 -
结构体的大小(内存对齐)
#includeusing namespace std;int main(int argc, char *argv[] ){ struct //C++可以有空结构体,在G++编译器定义为1字节 { } my_student ; cout cout原创 2016-05-26 12:55:54 · 538 阅读 · 0 评论 -
字符左旋函数
helloworld 左旋后elloworldh以后可以推到旋转到左旋n位小结:这道题目不难,但可以体现编程思想,有易到难,由模糊到具体 比如上篇,求孪生素数,那么先得找到那些是素数,然后在这些里面 找到孪生素数,比如此题,左旋N位,那么先解决左移一位的#includevoid lftpshiftone(c原创 2016-05-26 00:11:01 · 577 阅读 · 0 评论 -
C语言中函数传递(实参 形参)
形参:在被调函数形参表中的变量名、数组名,该过程在被调用前,没有为它们分配内存,其作用是说明自变量的类型和形态以及在过程中的作用。 形参可以是 合法变量名,数组名 实参:从主调过程传递给被调用过程的参数值。实参可以是变量名、数组名、常数或表达式。在过程调用 传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型原创 2016-07-06 20:34:19 · 22846 阅读 · 5 评论 -
可变參函数设计
先写一个不定参函数 ,返回值为 不定参参数之和,ps(宏由自己定义的,与库里的不一样)#include <stdio.h> #define va_list void* //形参列表元素的指针#define va_arg(arg, type) *(type*)arg; arg = (char*)arg + sizeof(type); //取出不定参的第一个值原创 2016-07-20 12:39:10 · 951 阅读 · 0 评论 -
《位域》小结
位域位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位 2 .位域定义与结构定义相仿,其形式为: struct 位域结构名 { 位域列表 }; 其中位域列表的形式为: 类型说明符 位域名:位域长度 例如: struct bs { int a:8; //一个字节原创 2016-07-20 16:12:34 · 922 阅读 · 0 评论 -
变量、常量 的区别
变量之所以重要,是因为变量是编程语言中数据的符号标识和载体。变量是内存或寄存器中用一个标识符命名的存储单元,可以用来存储一个特定类型的数据,并且数据的值在程序运行过程中可以进行修改。可见,变量首先是一个标识符或者名称,就像一个客房的编号一样,有了这个编号我们在交流中就可方便言表,否则,我们只可意会,那多不方便。为了方便,我们在给变量命名时,最好能符合大多数人的习惯,基本可以望名知义,便于交流和维护;原创 2016-07-05 12:35:46 · 1592 阅读 · 0 评论 -
volatile
volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.简单地说就是防止编译器对代码进行优化.比如如下程序:1234XBYTE[2]=0x55;XBYTE[2]=0x56;XBYTE[2]=0x57;XBYTE[2]=0x58;原创 2016-08-11 11:30:15 · 523 阅读 · 0 评论 -
一些读取字符函数小结(getchar getch getche)
getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab) 是stdio.h中的库函,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了 从stdi原创 2016-10-05 15:26:36 · 1712 阅读 · 0 评论 -
一些输出函数小结(putchar puts fputs )
1. putchar函数的格式:putchar(ch) 其中ch可以是一个字符变量或常量,也可以是一个转义字符。2.putchar函数的作用:向终端输出一个字符。(1)putchar函数只能用于单个字符的输出,且一次只能输出一个字符。(2)在程序中使用putchar函数,务必牢记:在程序(或文件)的开头加上编译预处理命令(也称包含命令),即:#includ原创 2016-10-05 16:10:50 · 859 阅读 · 0 评论 -
EOF
#include#includeusing namespace std;int main(){ char c = 0; while((c = getchar()) != EOF) { putchar(c); } }它是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(std转载 2016-10-06 14:15:04 · 1446 阅读 · 0 评论 -
全局变量与局部变量的小结
全局变量、局部变量和作用域我们把函数中定义的变量称为局部变量(Local Variable),由于形参相当于函数中定义的变量,所以形参也是一种局部变量在这里“局部”有两层含义:1、一个函数中定义的变量不能被另一个函数使用。例如print_time 中的 hour 和 minute在 main函数中没有定义,不能使用,同样main 函数中的原创 2016-05-27 22:46:46 · 995 阅读 · 2 评论 -
C语言中变量的作用域
C语言中变量的作用域C语言中所有变量都有自己的作用域,申明变量的类型不同,其作用域也不同。C语言中的变量,按照作用域的范围可分为两种, 即局部变量和全局变量。 首先确定概念: 不管局部变量,还是全局变量,定义只有一次,声明可以多次, 定义分配空间大小,声明不分配空间大小 先看个列原创 2016-07-06 16:16:53 · 2228 阅读 · 0 评论 -
排序算法之——直接插入排序(二)
基本思想: 一个待排序数组,开始划分为一个有序数组和无序数组,即就是假设 a[0]为有序 a[1]…a[n-1]为无序数组,每次将一个待排序的数组的第一个元素与有序区进行比较,然后 插入合适的位置本例是采用优化的插入排序算法,结构简单 思路: j代表前面有序的元素个数, 将a[j] 插入到前面a[0]…a[j - 1] ,用数据交换代替数据移动,如果a[j - 1] >原创 2016-06-16 22:06:29 · 382 阅读 · 0 评论