FFmpeg开发必备的C语言

news/2024/7/10 21:39:03 标签: ffmpeg, c语言

文章目录

  • HelloWorld
  • 常用基本类型
  • 常量与变量
  • 指针与数组
  • 结构体
  • 枚举
  • 文件操作
  • C语言编译器
  • C语言调试器

HelloWorld

vi HelloWorld.c
#include <stdio.h>
  
int main(int argc,char* argv[]){
        printf("HelloWorld!\n");
        return 0;
}
clang -g -o helloworld HelloWorld.c

 ls -alt helloworld
 
./helloworld

在这里插入图片描述

常用基本类型

  • short、 int、 long
  • float、double
  • char
  • void
#include <stdio.h>
  
int main(int argc,char* argv[]){
        int a = 100;
        float b = 1.23;
        char c = 'C';

        printf("Hello World!\n");
        printf("a = %d\n",a);
        printf("b = %f\n",b);
        printf("c = %c\n",c);
        return 0;
}
clang -g -o helloworld1 HelloWorld.c

./helloworld1

打印:

Hello World!
a = 100
b = 1.230000
c = C

常量与变量

  • int a = 0; //变量,可以再赋值
  • const int len = 256; //常量定义

内存管理:
在这里插入图片描述

指针与数组

  • 指针就是内存地址:void* 、 char*
  • 数组 如:char c[2] 、 int arr[10]

指针:

  • 它就是内存中的一个地址
  • 指针本身运算
  • 指针所指内容的操作
    在这里插入图片描述
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char* argv[])
{
        int *a,*b;
        a = (int*)malloc(sizeof(int)); //在栈中开辟内存
        b = (int*)malloc(sizeof(int));

        *a = 1;
        *b = 2;

        int c[3] = {0,1,2};

        printf("addr of a:%p,%p,%d\n",&a,a,*a);
        printf("addr of b:%p,%p,%d\n",&b,b,*b);
        printf("addr of c:%p,%p,%d,%d,%d\n",&c,c,c[0],c[1],c[2]);

        return 0;
}
gcc -g -o testpoint testpoint.c 
./testpoint

打印结果:

addr of a:0x7ffee1cb1830,0x7fa99b402b60,1
addr of b:0x7ffee1cb1828,0x7fa99b402b70,2
addr of c:0x7ffee1cb184c,0x7ffee1cb184c,0,1,2

操作系统时如何管理内存的?

  • 栈空间
  • 堆空间
  • 内存映射

内存的分配与释放

  • 分配内存 void* mem = malloc(size);
  • 释放内存 free(mem);

内存泄漏与野指针

  • 不断向系统申请内存
  • 申请的内存不用,也不释放
  • 占用别人的内存称为野指针

函数指针

  • 返回值类型(*指针变量名)([形参列表]);
int func(int x);//声明一个函数
int(*f)(int x);//声明一个函数指针
f = func;//将func函数的首地址赋给指针f

函数指针示例:

 vi testfunc.c
#include<stdio.h>

int sum(int a,int b)
{
        return (a + b);
}

int sub(int a,int b)
{
        return (a- b);
}

int main(int argc,char* argv[])
{

        int(*f)(int,int);

        f = sum;
        int result = f(3,5);

        f = sub;
        int result2 =f(result,3);
        printf("3+5 = %d\n",result);
        printf("8-3 = %d\n",result2);

        return 0;
}
clang -g -o testfunc testfunc.c
./testfunc

打印:

3+5 = 8
8-3 = 5

结构体

vi testst.c 
#include<stdio.h>
  
struct st{
        int a;
        int b;
};

int main(int argc,char* argv[])
{
        
        struct st sst;
        sst.a = 10;
        sst.b = 20;
        printf("struct content is :%d,%d\n",sst.a,sst.b);
        
        return 0;

}
clang -g -o testst testst.c 
./testst

打印结果:

struct content is :10,20

枚举

vi testenum.c
#include<stdio.h>
  
enum e_type{
        red = 0,
        green,
        blue

};

int main(int argc,char* argv[]){
        enum e_type et;

        et = red;
        printf("the color is: %d\n",et);

        et = blue;
        printf("the color is: %d\n",et);

        return 0;
}
clang -g -o testenum testenum.c 
./testenum

打印结果:

the color is: 0
the color is: 2

文件操作

  • 文件类型 FILE* file;
  • 打开文件FILE* fopen(path,mode);
  • 关闭文件fclose(FILE*)
#include<stdio.h>
  
int main(int argc,char* argv[])
{
        FILE* file;
        char buf[1024] = {0,};
        file = fopen("1.txt","a+");//在末尾添加,游标指向末尾

        fwrite("hello world!",1,13,file);

        rewind(file);//游标指向最前

        fread(buf,1,13,file);
        fclose(file);

        printf("buf : %s\n",buf);

        return 0;
}
clang -g -o testfile testfile.c 
./testfile
buf : hello world!

C语言编译器

gcc/clang -g -O2 -o test test.c -I... -L... -l
  • -g: 输出文件中的调试信息
  • -O:对输出文件做指令优化
  • -o: 输出文件
  • -I: 指定头文件
  • -L:指定库文件位置
  • -l :指定使用哪个库

编译过程

  • 预编译
  • 编译
  • 链接,动态链接/静态链接
vi add.h
int add(int a,int b);
vi add.c
int add(int a,int b){
	return (a + b);
}
vi add.c
#include<stdio.h>
#include "add.h"

int main(int argc,char* argv[])
{
	printf("add = %d\n",add(2,3));
	return 0;
}

clang -g -c add.c
libtool -static -o libmylib.a add.o
clang -g -o testlib testlib.c -I. -L. -lmylib
./testlib

打印结果:

add = 5

或者:

clang -g -c testlib.c
clang -o testlib1 testlib.o -L . -lmylib
 ./testlib1

打印结果:

add = 5

C语言调试器

调试器原理

  • 编译输出带调试信息的程序
  • 调试信息包含:指令地址、对应源代码和行号
  • 指令完成后,回调

gdb和lldb

命令gdblldb
设置断点bb
运行程序rr
单步执行nn
跳入函数ss
跳出函数finishfinish
打印内容pp
lldb testlib
b main
 break list
r
s
p a
p b
finish
n
c #continue执行完之后的
quit # 退出

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

 cd testlib.dSYM/Contents/Resources/DWARF
 
 dwarfdump testlib 

在这里插入图片描述


http://www.niftyadmin.cn/n/1837443.html

相关文章

java -xms_JAVA_OPTS参数-Xms和-Xmx的作用 | 学步园

文章来源&#xff1a;http://www.cnblogs.com/zxp_9527/archive/2008/12/24/1361911.html因为调试JProfile&#xff0c;不断修改Tomcat初始内存参数&#xff0c;往往Servlet还没crash&#xff0c;环境先崩溃&#xff0c;开始怀疑初始化参数的作用。废话不多说&#xff0c;开始研…

理解向日葵甘特之五——使用数据组件)

在上一篇文章讲到SFData的设计的时候&#xff0c;已经简单的提到了数据组件要实现的功能&#xff0c;实际上&#xff0c;数据组件&#xff0c;是SFData的一个插件&#xff0c;这个插件可以调用 SFData的所有的方法和事件&#xff0c;用来完成一些附加的功能和数据逻辑&#xff…

Linux ls命令大全

参考&#xff1a;https://blog.csdn.net/Mechelle__/article/details/82560839 在Linux系统中&#xff0c;随时都会需要知道文件或者目录的相关信息。所以ls是Linux系统中最常被执行的命令之一。 ls&#xff1a;显示非隐藏文件的文件名&#xff0c;按文件名进行排序。ls -a&a…

C#中类的构造方法的简单说明

1、什么是构造方法&#xff1f; 首先&#xff0c;它是一个方法&#xff0c;它是类中 众多方法中的一个。其次&#xff0c;它具有类中其他方法所不具备的一些特性。 简单来说&#xff0c;它是一个有着特殊使命的方法,他的绰号叫构造。 2、构造方法相对其他方法有哪些不同&#x…

java泛型extends_泛型系列教材 (三)- Java 泛型通配符 ? extends super 的用法

6 个答案梦想的彼岸答案时间&#xff1a;2020-11-08这个意思应该是初始化之后不能在放进去了把&#xff0c;在初始化的时候可以另创一个ArrayList&#xff0c;在着里面就可以放入对象&#xff0c;然后再把引用指向他ArrayList alnew ArrayList();al.add(new APHero("SS&qu…

介绍当前流行的一些开源Flash视频播放器

Videobox Videobox是一个只有6k大小的脚本&#xff0c;用于在页面中显示视频。Videobox使用swfobject来嵌入Flash。视频可以来自Youtube、Metacafe、Google Video、iFilm和自己设置的Flash。 Videobox Lightbox Mootools FlowPlayer FlowPlayer是一个开源的Flash视频播放器…

带队所需要做的那些事(持续总结更新中)

开发执行中最重要的就是:目标和计划1。客户交流 2。需求调研 3。需求分析 4。需求确定 5。系统分析&#xff08;可行性分析,物理结构&#xff0c;逻辑结构&#xff0c;各个功能确认&#xff09; 6。系统设计&#xff08;物理结构&#xff0c;逻辑结构&#xff0c;各个功能确认&…

8月第3周回顾:四巨头发三大新闻 一报告引多家争议

8月15日是51CTO.com成立两周年的日子&#xff0c;网站举办了多种活动进行了庆祝&#xff1b;凑巧的是&#xff0c;IT界在本周也热闹非凡&#xff1a;微软、甲骨文、IBM和Sun联手送上三份重要新闻&#xff1b;国内一份个人安全的报告引起一场小小的风波——这些都足以让关注IT技…