GDB调试详解
关于
使用gcc或g++编译程序时加上-g参数即可将调试信息加入生成的目标文件,否则使用gdb调试时函数名、变量名都只能显示内存地址。直接运行gdb即可进入gdb,然后输入file a.out即可开始调试a.out,当然也可以直接gdb a.out进入a.out的调试状态。可以使用在命令行状态下使用gdb -help来查看帮助,当然也可以用man。在gdb调试状态下使用help可心获得更强大的帮助,类似vim中的帮助,gdb调试状态下使用help step即可查看单步调试相关的帮助。gdb状态下使用quit退出gdb。进入GDB时可以使用可选参数-tui进入GDB的文本用户界面,该界面可以分屏显示源代码及断点所在行,比使用list查看代码方便很多,而且支持使用上下键来滚动显示代码,此时的命令行历史切换需要使用ctrl+n和ctrl+p。当然有一些支持GDB调试的图形软件ddd和code::block。
GDB基本用法
举例详解一维数组、二维数组与指针、函数的问题
首先需要清楚数组名是数组首元素的地址,不管是一维还是多维,它是个常量,而指针是个可以存储地址的变量。使用时可以将数组名看成一个常量指针。
C/C++中没有内置的多维数组,多维数组是数组的数组。例如二维数组就是元素为一维数组的一维数组,此时数组名依然是数组的第一个元素的地址。
具体解释看代码注释及代码的运行结果。
C/C++中的函数无法返回数组,所以在使用函数操作数组时,只能通过指针或者结构体等方式来间接返回数组,当然可以返回数组名,因为数组是个地址,相当于一个常量指针。具体详解可以看SOF: Return a 2d array from a function
C/C++中二维动态数组的使用方法举例
C/C++中的二维数组实际上都是以一维数组为元素的一维数组,C++中可以有三种方式申请动态数组:
- 使用C语言中的malloc分配,free释放
- 使用C++中的new[]分配,delete[]释放
- 使用C++中的vector实现
下面分别举例说明:
Linux下常用命令与快捷键整理
Linux下面的一些常用命令和terminal的常用快捷键整理,并不断补充
举例详解指针和引用作为函数参数时的不同
以下为个人理解:
当引用和指针作为参数传递给函数时,函数参数依然是按值传递的方式。指针实实在在就是个指针,它本身是需要占用内存的,只是它可以指向某个变量的地址。所以当将指针作为参数传递时,将传递指针本身的副本,也就是说在函数内部修改指针指向,即对指针赋值只在函数局部生效(注意是对指针变量本身赋值,而不是对其解引用赋值)。但指针所指向的变量就是实实在在的变量,即可以通过指针在函数内部修改指针所批变量的值(即对指针的解引用赋值)。
而引用则是其原变量的别名,可以理解为原变量的真实地址,所以所有对引用的修改,都相当于对原变量直接进行修改。在将其传递给函数时也一样,就是实实在在的地址,所有是否拷贝并不影响,对其赋值就相当于向相应的内存地址中将值写入
下面具体举例说明:
Linux实用工具总结之cron
一些会比较经常用到的Linux下的工具,当然都是命令行。多数工具需要与正则表达式配合使用,所以可以很多工具使用前都需要先了解正则表达式,正则表达式可以参考这里正则表达式学习笔记
Linux实用工具总结之awk
一些会比较经常用到的Linux下的工具,当然都是命令行。多数工具需要与正则表达式配合使用,所以可以很多工具使用前都需要先了解正则表达式,正则表达式可以参考这里正则表达式学习笔记
Linux实用工具总结之grep
一些会比较经常用到的Linux下的工具,当然都是命令行。多数工具需要与正则表达式配合使用,所以可以很多工具使用前都需要先了解正则表达式,正则表达式可以参考这里正则表达式学习笔记
Linux实用工具总结之sed
一些会比较经常用到的Linux下的工具,当然都是命令行。多数工具需要与正则表达式配合使用,所以可以很多工具使用前都需要先了解正则表达式,正则表达式可以参考这里正则表达式学习笔记