学习笔记-Linux C编程实践
2016-10-01 20:31
141 查看
每天一个linux命令
简短的记一下笔记:
make工具可以把大型项目分成若干模块儿
仅当
main(int argv, char* argc[])参数
Linux C语言 标准输入流 / 输出流 / 错误流(文件I / O)
I/O重定向:
0代表标准输入
1代表标准输出
2代表便准错误
在理解I/O重定向的基础上,开始理解管道的原理及应用
用代码举例:
管道的意思就是,把
利用这个原理,可以使用Linux中的各种小工具(命令行)组合起来编写一些更实用的工具。
Linux C语言指针与内存
gdb调试工具:
x/5d 0xffffffffffdd 表示从指定地址打印连续5个变量的值
指针:
第8行:可以执行,但有极大的安全隐患,一旦输入的字符数超过了预先为其分配的栈内存空间(6字节),会覆盖栈中其它数据,结果不可控。
第9行:这条语句会出错,因为str2指向一个字符串常量,这个字符串常量保存在内存空间中的代码段,不允许程序更改。
第10行:同第8行。
Linux C语言结构体
编译预处理:hello.c -> hello.i
在预处理阶段会进行“宏”的处理,包括对“宏函数”的处理:
结构体指针:
共用体(联合体)
共用体的地址和其各个成员的地址都是相同的:
结构体成员 内存对齐:
内存对齐的规定:每个成员,相对于结构体首地址的偏移量,必须是这个成员所占内存大小的整数倍
递归原理
注意与递推区别:
递归是从N到1
递推是从1到N
嗯差不多就到这啦~
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中的各种小工具(命令行)组合起来编写一些更实用的工具。
Linux C语言指针与内存
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行。
Linux C语言结构体
编译预处理: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
嗯差不多就到这啦~
相关文章推荐
- Linux实践工程师学习笔记三
- Grove.net实践ORM学习笔记
- Linux实践工程师学习笔记五
- Linux实践工程师学习笔记十七
- 关于LINQ(语言集成查询)的一些学习笔记(没实践过的)
- Linux实践工程师学习笔记十二
- Linux实践工程师学习笔记十九
- Linux实践工程师学习笔记十五
- Linux实践工程师学习笔记二
- Grove.net实践ORM学习笔记
- Linux实践工程师学习笔记六
- 动态代理实践的学习笔记
- Linux实践工程师学习笔记十六
- Linux实践工程师学习笔记十一
- Linux实践工程师学习笔记一
- Linux实践工程师学习笔记二
- [ASP.NET学习笔记之三]ADO.NET开发最佳实践
- Linux实践工程师学习笔记二十一
- Linux实践工程师学习笔记二十二
- 数据库开发技术与工程实践 学习笔记