学习笔记-Linux C编程实践

每天一个linux命令


Linux C编程

学习了 慕课网:Linux C语言编程基本原理与实践
简短的记一下笔记:

  1. #inlcude先搜索INCLUDE环境变量的路径
  2. #inlcude"file.h"先搜索当前目录
  3. make工具可以把大型项目分成若干模块儿
  4. gcc main.c -o main && ./main 可以同时执行两条命令,
    仅当&& 前面返回0时,&& 后面的命令才执行;
  5. echo &? 可以查看程序是否执行成功(return 0)
  6. main(int argv, char* argc[])参数
  7. Linux C语言 标准输入流 / 输出流 / 错误流(文件I / O)
//printf("str");
fprintf(stdout, "str");

//scanf("%d", &value);
fscanf(stdin, "%d", &value);

//当return !0;
fprintf(stderr, "errStr");
return 1;//返回非0的数代表程序执行出错
  1. 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
  1. 在理解I/O重定向的基础上,开始理解管道的原理及应用

    用代码举例:

$ ls /etc/ | grep ab // etc是Linux默认配置文件的存放目录。

管道的意思就是,把ls /etc/ 的输出作为 grep ab 的输入。
利用这个原理,可以使用Linux中的各种小工具(命令行)组合起来编写一些更实用的工具。


Linux C语言指针与内存

  1. gdb调试工具:
  2. start单步调试
  3. p是print的缩写,可以打印变量的值。
  4. n是next的缩写,表示执行当前行并跳到下一行代码。
  5. s表示跳进当前行的函数内,f表示跳出函数。
  6. x/5d 0xffffffffffdd 表示从指定地址打印连续5个变量的值

指针:

#include
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行。


Linux C语言结构体

  1. 编译预处理:hello.c -> hello.i
    $ gcc -E hello.c -o hello.i 其中-E 控制预处理结束即停止。
    在预处理阶段会进行“宏”的处理,包括对“宏函数”的处理:
#include

//定义一个宏函数,参数不必指定类型
#define ADD(a, b) (a + b)

int main()
{
    int sum = ADD(1, 2);//预处理后:int sum = (1 + 2);
    return 0;
}
  1. 结构体指针:
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);
}
  1. 共用体(联合体)
    共用体的地址和其各个成员的地址都是相同的:
union Data{
    int a;
    char b;
    int c;
};

int main()
{
    union Data data_1;
    data_1.a = 1;
    data_2.b = 'C';//覆盖前一个值
}
  1. 结构体成员 内存对齐:
    内存对齐的规定:每个成员,相对于结构体首地址的偏移量,必须是这个成员所占内存大小的整数倍
struct Data{
    int a;  //相对结构体首地址的偏移量是0
    char b; //相对结构体首地址的偏移量是4
    int c;  //相对结构体首地址的偏移量是8,在b后面填充3个字节
};
/*该结构体占用空间为12字节,是所有成员中所占的最大空间(int占4字节)的整数倍,所以c后不必填充字节。否则填充至最大成员所占空间大小的整数倍。*/
  1. 递归原理
    注意与递推区别:
    递归是从N到1
    递推是从1到N

嗯差不多就到这啦~

你可能感兴趣的:(学习笔记)