欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

六、Linux——malloc、Makefile

程序员文章站 2022-05-12 08:40:44
...

【1】存储模型

        1、生命期:变量占据内存的时间期限--静态变量和动态变量
        2、作用域:变量出现的有效区域---局部变量和全局变量

六、Linux——malloc、Makefile

【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)



相关标签: makefile malloc