《Linux C编程一站式学习》笔记
gcc编译
直接编译
gcc main.c a.out
指定可执行文件名
gcc main.c -o main main
提示所有的警告信息
gcc -Wall main.c
查看预处理之后、编译之前的程序
gcc -E main.c
生成随机数
rand()
/* rand()生成的随机数是介于0~RAND_MAX之间的整数,不同平台上RAND_MAX的值可能不一样。 */ #include <stdlib.h> rand()%upper_bound
用srand函数指定Seed来生成随机数
/* time函数得到的是距离1970年1月1日00:00:00的秒数 NULL表示空指针 */ #include <stdlib.h> #include <time.h> srand(time(NULL));
字符串
- 符串字面值是只读的,
“Hello, world!”[0] = 'A';
是不允许的。 char str[10] = "Hello";
相当于char str[10] = { 'H', 'e', 'l', 'l', 'o', '\0' }
。printf("string: %s\n", str);
表示printf从数组str的开头一直打印到'\0'为止('\0'本身不打印)。如果没有'\0'会出现越界。
多维数组
int a[][2] = {
{ 1, 2 },
{ 3, 4 },
{ 5 }
};
/* 第一维可以不指定,而是由编译器自动计算 */
char days[8][10] = {
"Monday",
"Tuesday"
}
scanf
int man, ret;
ret = scanf("%d", &man);
if (ret != 1) {
printf("Invalid input!\n");
}
/*
等待用户输入一个整数并回车,这个整数会被 scanf 函数保存在 man 这个整型变量里。如果用户输入合法(输入的确实是整数而不是字符串),则 scanf 函数返回1,表示成功读入一个数据。
%d、%f、%c分别表示读入一个整数、浮点数或者字符,第二个参数需要加&;
%s表示字符串,第二个参数应该是数组名,不需要加&
*/
indent
indent -kr -i8 main.c
gdb调试
在编译时要加上-g选项,生成的目标文件才能用gdb进行调试:
gcc -g main.c -o main gdb main
- backtrace(或bt) 查看各级函数调用及参数
- finish 执行到当前函数返回,然后停下来等待命令
- frame(或f) 帧编号 选择栈帧
- info(或i) locals 查看当前栈帧局部变量的值
- list(或l) 列出源代码,接着上次的位置往下列,每次列10行
- list 行号 列出从第几行开始的源代码
- list 函数名 列出某个函数的源代码
- next(或n) 执行下一行语句
- print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数
- set var 修改变量的值
- start 开始执行程序,停在main函数第一行语句前面等待命令
- step(或s) 执行下一行语句,如果有函数调用则进入到函数中
- break(或b) 行号 在某一行设置断点
- break 函数名 在某个函数开头设置断点
- break...if... 设置条件断点
- continue(或c) 从当前位置开始连续而非单步执行程序
- delete breakpoints 删除断点display 变量名 跟踪查看一个变量,每次停下来都显示它的值
- disable breakpoints 禁用断点
- enable breakpoints 启用断点
- info(或i) breakpoints 查看当前设置了哪些断点
- run(或r) 从头开始连续而非单步执行程序
- undisplay 取消对先前设置的那些变量的跟踪
- watch 设置观察点
- info(或i)
watchpoints 查看当前设置了哪些观察点
(gdb) watch input[5] Hardware watchpoint 2: input[5] (gdb) i watchpoints Num Type Disp Enb Address What 2 hw watchpoint keep y input[5] Hardware watchpoint 2: input[5] Old value = 1 '\001' New value = 2 '\002' 0x0804840c in main () at main.c:11 11 for (i = 0; input[i] != '\0'; i++)
x 从某个位置开始打印存储器的一段内容,全部当成字节来看,而不区分哪些字节属于哪些变量
(gdb) x/7b input