您的位置:首页 > 运维架构 > Linux

学习笔记-Linux C编程实践

2016-10-01 20:31 141 查看
每天一个linux命令

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 c语言 编程