六、Linux——malloc、Makefile
程序员文章站
2022-05-12 08:40:44
...
【1】存储模型
1、生命期:变量占据内存的时间期限--静态变量和动态变量
2、作用域:变量出现的有效区域---局部变量和全局变量
【2】malloc (手动分配和释放)
void *malloc(size_t size);
功能:申请size个字节大小的空间
返回值:就是这段申请的首地址
void free(void *ptr);
功能:释放堆区手动申请的空间
malloc 和 free 一般是配对使用,有申请一般都有释放
【3】Makefile
target : dependency_files
<TAB> command
1---
gcc -c main.c -o main.o
gcc main.o -o main
main:main.o
main.o:main.c
2---
gcc -c main.c -o main.o
gcc -c add.c -o add.o
gcc -c sub.c -o sub.o
gcc *.c -o main
3---
$< 第一个以依赖文件的名称
$+ 所有的依赖文件,以空格分开,并且出现的先后为序
$^ 所有不重复的依文件,以空格分开
aaa@qq.com 目标文件的完整名称
$* 不包含扩展名的目标文件名称
$? 所有时间戳比目标文件晚的依赖文件,并以空格分开
$% 如果目标是归档成员,该变量表示目标的归档成员名称
源码及注释
1、register.c
#include <stdio.h>
int main(int argc, const char *argv[])
{
register int i, j; //寄存器成员变量
for(i=0; i<1000; i++)
{
for(j=0; j<10000; j++)
{
printf("%d\n",i*j);
}
}
return 0;
}
2、static.c
#include <stdio.h>
//与程序同步
//只初始化一次
//默认初始化为0
int fun()
{
static int a; //静态成员变量
a += 5;
printf("a = %d\n",a);
return 0;
}
int main(int argc, const char *argv[])
{
fun();
fun();
fun();
return 0;
}
4、多文件工程
1.c
#include <stdio.h>
int a = 12;
int b = 9;
int fun()
{
printf("hello\n");
}
2.c
#include <stdio.h>
extern int a; //extern,引入外部变量
extern int b;
extern int fun();
int main(int argc, const char *argv[])
{
printf("add = %d\n", a+b);
fun();
return 0;
}
4、malloc.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//void *malloc(size_t size);
//void free(void *ptr);
#define N 32
char *fun()
{
char *p = (char *)malloc(N * sizeof(char)); //开辟size字节空间
//返回空间的首地址
strcpy(p,"saber");
return p;
}
int main(int argc, const char *argv[])
{
char *w = fun();
printf("w = %c\n",*(w+4));
free(w); //释放的是w所指向的动态内存空间
w = NULL; //防止野指针的形成
return 0;
}
5、malloc.c
#include <stdio.h>
#include <stdlib.h>
typedef struct str{
int a;
int b;
}data_t; //data_t:类型名
int main(int argc, const char *argv[])
{
data_t *p = (data_t *)malloc(sizeof(data_t));
p->a = 10;
p->b = 'K';
printf("a = %d\n",p->a);
printf("b = %c\n",p->b);
free(p);
p = NULL;
return 0;
}
6、Makelick 实例
add.c:
int add(int a, int b)
{
return a+b;
}
sub.c:
int sub(int a, int b)
{
return a-b;
}
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
printf("add = %d\n", add(N, 7) );
printf("add = %d\n", sub(N, 7) );
return 0;
}
head.h
#ifndef _HEAD_H_
#define _HEAD_H_
//全局变量 头文件的包含 函数的声明 宏
#include <stdio.h>
extern int add(int a, int b);
extern int sub(int a, int b);
#define N 13
#endif
Makefile
main:main.o add.o sub.o
gcc main.o add.o sub.o -o main
main.o:main.c head.h
gcc -c main.c -o main.o
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
.PHONY:
clear
clear:
rm *.o main
OBJS = main
CFLAGS = -c -Wall -O2
CC = gcc
$(OBJS):$(OBJS).o add.o sub.o
$(CC) $^ -o aaa@qq.com
$(OBJS).o:main.c head.h
$(CC) $(CFLAGS) $< -o aaa@qq.com
add.o:add.c
$(CC) $(CFLAGS) $< -o aaa@qq.com
sub.o:sub.c
$(CC) $(CFLAGS) $< -o aaa@qq.com
.PHONY:
clear
clear:
rm *.o $(OBJS)