
文章目录8. 内存管理、位运算8.1 堆区空间8.1.1 堆区空间使用动态内存使用8.1.2 堆区空间建立动态数组8.2 堆区和栈区的区别8.3 位运算9. 程序调试方法9.1 打印调试。9.2 gbd调试此处为C语言汇总版:【C语言md编辑器版】从0基础开始到熟练掌握完整篇,共9部分8. 内存管理、位运算8.1 堆区空间在函数中开辟的空间希望随着函数结束该空间仍然存在可以去堆上开辟。当需要的空间比较大时可以去堆上开辟栈区空间有限默认8M。8.1.1 堆区空间使用动态内存使用堆区空间申请void*malloc(size_n);size_n:申请堆区空间的大小以字节为单位。注意申请的字符串堆区空间返回的指针不能直接赋值若直接赋值则会导致申请的堆区空间地址丢失不能释放内存产生内存泄漏程序运行过程中堆区申请的空间在使用完没有释放则造成内存泄漏。如下例子所示char*pstr1malloc(100);char*pstr2malloc(100);printf(psrt1 %p,pstr2 %p\n,pstr1,pstr2);pstr1hello world;strcpy(pstr2,hello world);printf(pstr1 %p,pstr2 %p\n,pstr1,pstr2);printf(pstr1 %s, pstr2 %s\n,pstr1,pstr2);堆区空间释放为了防止内存泄漏在使用完申请的堆区空间后必须进行空间释放。voidfree(void*ptr);ptr:申请到的堆区空间首地址。8.1.2 堆区空间建立动态数组malloc#includestdio.h#includestdlib.h#defineARRAYNUM10intmain(){int*pamalloc(ARRAYNUM*sizeof(int));if(paNULL){printf(malloc error!\n);}for(inti0;iARRAYNUM;i){pa[i]i;}for(inti0;iARRAYNUM;i){printf(%d ,pa[i]);}printf(\n);free(pa);return0;}calloc向堆区申请数组并清空成0.void*calloc(size_tnmemb,size_tsize);nmemb:申请的数组的元素个数size:数组中的每个元素占的字节数 成功:返回申请到的空间首地址 失败:NULL8.2 堆区和栈区的区别栈区1. 栈区用来保存局部变量、函数的形参返回值、及函数调用时的保护线程2. 栈区由操作系统自动管理3. 栈区默认大小为8M比堆区空间小4. 栈区的访问效率要比堆区访问效率高。堆区1. 堆区由开发人员手动申请和释放使用完需要及时释放否则会造成内存泄漏。2. 堆区空间比栈区空间大访问效率相对较低。8.3 位运算运算符名称意义按位与全1为1有0为0|按位或有1为1全0为0^按位异或相同为0相异为1~按位取反1为00为1按位左移低位补0num n—— num * 2^n按位右移有符号数高位补符号位无符号数高位补0num n—— num / 2^n位运算的使用指定第n位置一1010 0000 —— 1010 1000 0000 0001 3 | num num num | 1 n指定第n位清零1010 1010 —— 1010 0010 1010 1010 1111 0111 ~(1 3 ) 1010 1010 num num ~(1n)两数交换a a ^ b; b a ^ b; a a ^ b; a ^ a 0; a ^ 0 a; b (a ^ b) ^ b a ^ b ^ b a ^ (b ^ b) a ^ 0 a; a a ^ b a ^ b ^ a 0 ^ b b; 两数交换(中间变量): int tmp 0; tmp a; a b; b tmp; 求和方式: aab; ba-b; aa-b; a b -b a a b - b a b - a位运算符优先级由大到小~ ^|9. 程序调试方法9.1 打印调试。程序运行中途打印输出使用printf()函数。9.2 gbd调试gun提供的linux代码调试工具1. 使用gbd调试逻辑错误。2. 使用gbd调试段错误。编译程序-g选项允许使用gdb进行调试gcc main.c-g使用gdb调试程序gdb ./可执行程序 gdb ./a.outgdb指令汇总指令功能l列出源代码b行号在指定行打断点r运行程序n执行下一行代码单步跳过不进入函数p变量名查看变量值q退出gdbs跟进函数单步进入函数内部where定位段错误的位置