在linux上编译C

1. 写好源代码后,使用gcc编译器来编译
通过函数来查找所需包含的头文件
man 2/3 函数名 // man 2 一般用于查找linux系统里的函数
// man 3 是C通用的函数
通过头文件来查找头文件里声明的函数
man 头文件名 // 如 man stdio.h
gcc test.c //编译test.c里的代码,默认生成可执行文件 a.out
gcc test.c -o myexe //指编译生成的可执行文件名为myexe
执行: ./myexe 或者 路径/myexe
2. 计算机中的内存.
一个程序需要执行起来,需要把整个程序镜像(可执行文件)加载到内存上。 而且执行中的程序中的变量也需在内存里分配空间 
程序: 就是编译出来的可执行文件
进程: 处于执行状态的程序叫进程, 一个程序可以有多个进程
在代码里:
int aaa; //意味着需要在内存里划分出4字节空间用于存放变量aaa的值, 划分出来的空间的地址就是&aaa.
一个程序镜像,会成好多个段,其中有几个段是我们要了解的:
反汇编可执行文件: objdump -D 可执行文件
objdump -D 可执行文件 | less
在函数体内声明出来的变量,它的作用域只能在此函数体里,这种变量叫局部变量
在函数体外声明出来的变量,它的作用域是整个程序, 这种变量叫全局变量
静态变量,如果是在函数内部声明,它的作用域只能在此函数内部,只会初始化一次.
静态变量如果是在函数外部声明的,它的作用域只能在此源文件里.
代码段(.text): 在程序中某个位置开始的区域专门存放代码生成的机器指令. 我们写的代码编译完成后,都是放在代码段
数据段(.data): 存放已初始化的全局变量与静态变量. 数据段所需的空间在编译时就会分配出来.
只读数据段(.rodata): 存放只读的数据. 只读数据所需的空间也是在编译时就会由编译器分配出来的
未初始化数据段(.bss): 没有初始化的全局变量与静态变量(赋0值也是不算初始化). bss段所需的空间在编译时没有分配,直到程序加载到内存时,系统才会给进程分配出来

栈:是系统划分出来的一个区域, 是所有进程共用的空间,专用于局部变量空间的分配. 每个进程在栈都只能使用限定的大小空间(不能超过12M, 超出会发出段错误). 栈是从高地址往低地址分配空间的
堆: 也是系统划分出来的一个区域,用于所有进程动态申请的空间.每个进程申请的空间大小没有限制,只要系统还有空闲的内存就可以.堆是从低地址往高地址分配空间的

局部变量: 只有在代码执行时才会分配空间, 局部变量在栈里分配空间, 在所属的函数执行结束时回收空间.C语言里在堆动态申请空间,使用malloc()函数。动态申请出来的空间不再使用时,应使用free()函数回收.
"&" 取地址符号, "&变量名"
"*指针变量名" : 取指针变量存放的地址上存放的值
指针也是变量中的一种, 用于存放其它变量的地址或动态申请出来的空间的首地址. 指针本身也需要占用内存空间, 也就是有占用内存地址

int num = 99; //在内存上分4字节空间,空间的首地址为&num, 此空间上存放的值为99
int *p = # //声明一个指针变量p, p存放的值就是变量num的地址
&p : 取指针变量本身的地址
p : 取指针变量存放的值,也就是存放的其它变量的地址
*p : 取指针变量存放的地址(&num)上面存放的值(num)

void *malloc(size_t size); //在堆里申请size字节空间大小
返回值类型为: void *(通用类型的地址,用任何类型的指针变量都可以接收返回值).
返回值为申请出来的空间的首地址

void free(void *ptr); //释放申请出来的内存, ptr为要回收的空间的首地址

原文地址:https://www.cnblogs.com/LinxiHuang/p/9245879.html

时间: 2024-10-19 09:44:41

在linux上编译C的相关文章

在64位linux上编译32位程序

ld指令有一个选项:--oformat output_format,用于指定输出文件的格式.输入文件./kernel/kernel.o等是elf32格式,当前系统是64位,而ld默认生成的文件格式是elf64-x86-64:因此会出现"ld: warning: i386 architecture of input file `./kernel/kernel.o' is incompatible with i386:x86-64 output"这样的提示.之前,将系统从三墩转移到我自己的

尝试在Linux上编译KestrelHttpServer

Kestrel是目前在非Windows平台上运行ASP.NET 5应用程序的唯一可用Web服务器,但微软似乎将它冷落在一边,源代码更新很慢. 今天试着在Linux上编译Kestrel的源代码,遇到了很多问题.在这篇博文中记录一下. 运行编译命令: ./build.sh 出错信息: -bash: ./build.sh: Permission denied 修复方法: chmod +x build.sh 再次编译,出错: ./build.sh: line 31: packages/KoreBuild

Linux上编译Redis4.0.2

Linux上安装部署Redis4.0.2 安装Redis4.0.2,需要先安装依赖: yum -y install gcc gcc-c++ libstdc++-devel tcl -y 下载Redis4.0.2的安装包: wget http://219.238.7.71/files/403400000ABE0C0C/download.redis.io/releases/redis-4.0.2.tar.gz 解压缩: tar -zxvf redis-4.0.2.tar.gz -C /usr/loc

在64位linux上编译32位程序 for i386 intel

编辑中 # ld -V GNU ld version 2.15.92.0.2 20040927 Supported emulations: elf_x86_64 elf_i386 i386linux #ld -m elf_i386 Along with the -m32 flag in gcc, you may need to include the -melf_i386 flag for ld to properly link the 32bit object files to the 32b

go在Linux上编译Windows执行文件

参考:http://studygolang.com/topics/21 (1)首先进入go/src 源码所在目录,执行如下命令创建目标平台所需的包和工具文件. $ cd /usr/local/go/src$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash 如果是 Windows 则修改 GOOS 即可.$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash-------------------

在Linux上编译dotnet cli的源代码生成.NET Core SDK的安装包

.NET 的开源,有了更多的DIY乐趣.这篇博文记录一下在新安装的 Linux Ubuntu 14.04 上通过自己动手编译 dotnet cli 的源代码生成 .net core sdk 的 deb 安装包. 1)安装一个现有版本的 .net core sdk sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ trusty main" > /etc

在SUSE LINUX上编译安装CouchDB1.5.0

按照这个步骤装了两台,在SUSE上安装是没有问题了,打包的话还在研究,查了一下光拷贝编译后文件有些问题. 软件版本及依赖: 1.SpiderMonkey 1.7.0 2.icu4c 4.2.1 3.libcurl 7.36.0 4.ncurses 5.9 5.openssl 1.0.1g 6.erlang R16B03 依赖 ncurses.openssl 7.couchDB 1.5.0 依赖上述所有 SpiderMonkey: js-1.7.0.tar.gz 1 tar 2 cd 3 make

Linux上编译CoreCLR源代码

>>Build日期:2015-2-5. Linux发行版用的是CentOS 6.5,操作步骤: 1)配置git: git config --global http.sslverify false 2)签出github上的CoreCLR代码库: git clone https://github.com/dotnet/coreclr.git 3)安装cmake: yum install cmake 4)安装clang: yum install clang 5)运行build命令: sh build

在Linux上编译安装php开发环境(install apache)-2

1.查看配置选项     ./configure -h 2.配置Apache  ./configure  --prefix=/usr/local/apache2 \               //指定Apache的安装位置  --sysconfdir/etc/httpd/ \                   //指定Apache配置文件的存放位置  --with-z=/usr/local/zlib/                   //指定zlib库文件的位置  --with-incl