Linux C编程
学习了 慕课网:Linux C语言编程基本原理与实践
简短的记一下笔记:
#inlcude<file.h>
先搜索INCLUDE环境变量的路径#inlcude"file.h"
先搜索当前目录- make工具可以把大型项目分成若干模块儿
gcc main.c -o main && ./main
可以同时执行两条命令,
仅当&&
前面返回0时,&&
后面的命令才执行;echo &?
可以查看程序是否执行成功(return 0
)- main(int argv, char* argc[])参数
- Linux C语言 标准输入流 / 输出流 / 错误流(文件I / O)
//printf("str");
fprintf(stdout, "str");
//scanf("%d", &value);
fscanf(stdin, "%d", &value);
//当return !0;
fprintf(stderr, "errStr");
return 1;//返回非0的数代表程序执行出错
- I/O重定向:
0代表标准输入
1代表标准输出
2代表便准错误
//从stdin重定向
$ ./main.out 0 < input.txt //0可不写
//从stdout重定向
$ ./main.out 1 > output.txt //覆盖写。1可不写
$ ./main.out 1 >> output.txt //追加写。1可不写
//从stderr重定向
$ ./main.out 2 > error.txt
在理解I/O重定向的基础上,开始理解管道的原理及应用
用代码举例:
$ ls /etc/ | grep ab // etc是Linux默认配置文件的存放目录。
管道的意思就是,把ls /etc/
的输出作为 grep ab
的输入。
利用这个原理,可以使用Linux中的各种小工具(命令行)组合起来编写一些更实用的工具。
- gdb调试工具:
start
单步调试p
是print的缩写,可以打印变量的值。n
是next的缩写,表示执行当前行并跳到下一行代码。s
表示跳进当前行的函数内,f
表示跳出函数。- x/5d 0xffffffffffdd 表示从指定地址打印连续5个变量的值
指针:
#include<stdio.h>
int main()
{
char str[] = "hello";
char *str2 = "world";
char str3[];
scanf("%s", str);
scanf("%s", str2);
scanf("%s", str3);
return 0;
}
第8行:可以执行,但有极大的安全隐患,一旦输入的字符数超过了预先为其分配的栈内存空间(6字节),会覆盖栈中其它数据,结果不可控。
第9行:这条语句会出错,因为str2指向一个字符串常量,这个字符串常量保存在内存空间中的代码段,不允许程序更改。
第10行:同第8行。
- 编译预处理:hello.c -> hello.i
$ gcc -E hello.c -o hello.i
其中-E
控制预处理结束即停止。
在预处理阶段会进行“宏”的处理,包括对“宏函数”的处理:
#include<stdio.h>
//定义一个宏函数,参数不必指定类型
#define ADD(a, b) (a + b)
int main()
{
int sum = ADD(1, 2);//预处理后:int sum = (1 + 2);
return 0;
}
- 结构体指针:
struct Node{
char name[20];
int value;
};
int main()
{
struct Node node_1 = {"node_1", 1};
struct Node *p = &node_1;
//(*p).name <=> p->name <=> node_1.name
printf("%s\n", (*p).name);
}
- 共用体(联合体)
共用体的地址和其各个成员的地址都是相同的:
union Data{
int a;
char b;
int c;
};
int main()
{
union Data data_1;
data_1.a = 1;
data_2.b = 'C';//覆盖前一个值
}
- 结构体成员 内存对齐:
内存对齐的规定:每个成员,相对于结构体首地址的偏移量,必须是这个成员所占内存大小的整数倍
struct Data{
int a; //相对结构体首地址的偏移量是0
char b; //相对结构体首地址的偏移量是4
int c; //相对结构体首地址的偏移量是8,在b后面填充3个字节
};
/*该结构体占用空间为12字节,是所有成员中所占的最大空间(int占4字节)的整数倍,所以c后不必填充字节。否则填充至最大成员所占空间大小的整数倍。*/
- 递归原理
注意与递推区别:
递归是从N到1
递推是从1到N
嗯差不多就到这啦~