C---------------LessonDynamicMemory

来源:互联网 发布:说明书排版设计软件 编辑:程序博客网 时间:2024/06/01 08:20

#import <Foundation/Foundation.h>

//定义宏:三部分: 1.#define 2.宏名 3.替换的内容

//宏的作用: 只做替换.

//宏名的命名规范:1.全部大写. 2.k + 驼峰(kNumberArray)

//无参宏

#define NUMBER 6

//有参宏

//宏应该注意的几个问题:

//1.宏名大写.

//2.参数一定要加小括号.

//3.宏替换的内容不要加分号.

//4.对于有参宏,宏名和参数之间不要加空格.

#define MUL(A, B) ((A) * (B))

/**

 *  内存存储区的划分

 1.栈区:栈区主要存放函数内部定义的变量数组,函数调用时开辟空间,函数执行完毕回收空间,空间的开辟与回收由系统管理.

 2.堆区:堆区的最大特点,空间的开辟与释放由开发人员手动管理.

 3.全局区静态区:主要存放函数外部定义的全局变量以及静态变量,空间一旦开辟,就不会回收,直到应用程序执行结束.

 4.常量区:存储常量:1.整型常量 2.浮点型常量 3.字符常量 4.字符串常量

 5.代码区:存放程序编译之后生产的CPU指令.

 */

//交换两个变量的值

void swap(int *p, int *q);

void swap(int *p, int *q)

{

    int temp = *p;

    *p = *q;

    *q = temp;

}

//函数内部有一个数组存储字符串,返回字符窜的首地址

char *getString();

char *getString()

{

    //Address of stack memory associated with local variable 'str' returned

    //reason:局部变量的空间被返回,函数执行完毕之后,局部变量空间已经被系统回收.

    //solution:返回一个不被回收的空间.

    static char str[] ="iPhone";

    return str;

    //local  局部的

    //global  全局的

}

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

{

    //交换两个变量的值

    /*

    int a = 10, b = 5;

    swap(&a, &b);

    printf("a = %d, b = %d\n", a, b);

     */

    //在堆区开辟空间

    //void * 泛型,可以代表所有的指针类型.

    //自己根据空间上要存储的数据转一下类型即可

    //如果要存储两个整数,用int *,存储8个字符,用char *,存储4个整数,用short *.

    //malloc  在堆区开辟N个字节大小的空间,返回空间首地址.

    /*

    char *p = malloc(8);

    //存储iPhone.

    strcpy(p, "iPhone");

    printf("%s\n", p);

    //释放空间

    //删除只是标记删除,不会清除空间上的内容.

    free(p);

    p = NULL;//重新指向一块无效的区域.

//    free(p);

     */

    /**

     *  堆区空间的问题:

     1.野指针的问题:访问没有所有权的内存空间.

     2.过度释放:一块空间释放多次,程序会立即crash.

     3.内存泄漏:空间没有释放,造成内存堆积.不会造成立即crash,安全隐患.

     */

//    printf("%s\n", p);

    /*

    //1.申请一个有5个元素的数组空间,存储5个整数.

    int *p = malloc(5 * sizeof(int));

    for (int i = 0; i < 5; i++) {

        *(p + i) = arc4random() % (60 - 20 + 1) + 20;

        printf("%d ", *(p + i));

    }

    printf("\n");

    //2.升序排序

    for (int i = 0; i < 5 - 1; i++) {

        for (int j = 0; j < 5 - 1 - i; j++) {

            if (*(p + j) > *(p + j + 1)) {

                int temp = *(p + j);

                *(p + j) = *(p + j + 1);

                *(p + j + 1) = temp;

            }

        }

    }

    //3.输出

    for (int i = 0; i < 5; i++) {

        printf("%d ", *(p + i));

    }

     free(p);

     p = NULL; //重新指向一块无效的空间.

     */

    /**

     *  使用指针必备条件:

     1.指针要有明确指向.

     2.指向一个可控的区域.

     */

    /*

     int *p = NULL;

     *p = 20;

     */

    //有一字符串,其中包含数字,提取其中的数字,要求动态分配内存保存

    //提示:先计算出有几个数字,然后根据数字的个数来开辟空间.

    /*

    char str[] = "lkajkj535kjfakj2452kjjkl";

    int count = 0;

    int i = 0;

    while (str[i] != '\0') {

        if (str[i] >= '0' && str[i] <= '9') {

            count++;

        }

        i++;

    }

    char *p = malloc(count + 1);

    i = 0;

    int j = 0;

    while (str[i] != '\0') {

        if (str[i] >= '0' && str[i] <= '9') {

            *(p + j++) = str[i];

        }

        i++;

    }

    *(p + j) = '\0';

    printf("%s\n", p);

    free(p);

    p = NULL;

    */

    /*

    char str[] = "4435fggg5fasd";

    int count = 0;

    int i = 0;

    while (str[i] != '\0') {

        if (str[i] >= '0' && str[i] <= '9') {

            count++;

        }

        i++;

    }

    char *p = malloc(count + 1);

    i = 0;

    int j = 0;

    while (str[i] != '\0') {

        if (str[i] >= '0' && str[i] <= '9') {

            *(p + j++) = str[i];

        }

        i++;

    }

    *(p + j) = '\0';

    printf("%s\n", p);

    free(p);

    p = NULL;

     */

    //输入3个学员的姓名,动态分配内存保存学员姓名,并在最后输出

    //提示:定义一个指针数组保存数据char *names[3] = {0};

    //1.如何存储从控制台输入的字符串.

    /*

    char *names[3] = {0};

    char temp[100] = {0};

    for (int i = 0; i < 3; i++) {

        printf("输入姓名:");

        scanf("%s", temp);

        names[i] = malloc(strlen(temp) + 1);

        strcpy(names[i], temp);

    }

    for (int i = 0; i < 3; i++) {

        printf("%s\n", names[i]);

        free(names[i]);

        names[i] = NULL;

    }

     */

    //简单思考的习惯:将任务划分为一个一个单一的任务,逐一完成.

    //其他的内存分配函数

    //void * calloc(unsigned n, unsigned size);

    //分配n个size大小的空间,并且把该内存上的所有字节清零.

    /*

    int *p = calloc(5, 4);

    free(p);

    p = NULL;

    */

    //void *realloc(void *p, unsigned size);

    //按给定的地址开始,重新分配size大小的空间.

    /*

    int *p = malloc(10);

    //返回值,返回当前空间的首地址,如果当前空间不够,则在另一块空间上申请20个字节的空间,此时返回新的空间地址.

    printf("%p\n", p);

    int *p1 = realloc(p, 20);

    printf("%p\n", p1);

    free(p1);

    p1 = NULL;

    p = NULL;

     */

    

    //其他内存操作函数

//    void *memcpy(void *dest, const void *source, size_t n)

    //从source指向的内存开始拷到dest,拷n个字节

//    char *p1 = malloc(8);

//    //将空间清零

//    memset(p1, 0, 8);

//    char *p2 = malloc(8);

//    memset(p2, 0, 8);

//    strcpy(p2, "Frank");

//    printf("%s\n", p2);

    /*

    memcpy(p1, p2 + 4, 4);

//    *(p1 + 4) = '\0';

    printf("%s\n", p1);

     */

//    void *memset(void *s , int c , size_t n)

    //从s指向的内存开始初始化n个字节的内容为c

//    int memcmp(const void *buf1, const void*buf2, unsigned int count)

//    较buf1和buf2指向的内存是否相同,较count个字节

    

    

    

//    定义两个整型指针,分别malloc、calloc对其分配空间保存3个元

//    素,malloc分配的空间memset清零,随机对数组进赋值随机范

//    围1-3,赋值后memcmp较两个数组。如果相同打印Good!否则

//    打印Failed...

    /*

    int *p1 = malloc(3 * sizeof(int));

    int *p2 = calloc(3, sizeof(int));

    for (int i = 0; i < 3; i++) {

        *(p1 + i) = arc4random() % 4;

        *(p2 + i) = arc4random() % 4;

        printf("p1 = %d, p2 = %d\n", *(p1 + i), *(p2 + i));

    }

    if (memcmp(p1, p2, 3 * sizeof(int)) == 0) {

        printf("Good!");

    }

    free(p1);

    free(p2);

    p1 = NULL;

    p2 = NULL;

    */

    int a[NUMBER] = {0};

    for (int i = 0; i < NUMBER; i++) {

        a[i] = arc4random() % (60 -20 + 1) + 20;

        printf("%d ", a[i]);

    }

    printf("\n");

    for (int i = 0; i < NUMBER - 1; i++) {

        for (int j =0; j < NUMBER - 1 - i; j++) {

            if (a[j] > a[j + 1]) {

                int temp = a[j];

                a[j] = a[j + 1];

                a[j + 1] = temp;

            }

        }

    }

    for (int i = 0; i < NUMBER; i++) {

        printf("%d ", a[i]);

    }             //3 + 4 * 2 + 3

    int data = MUL(3 +4, 2 + 3);

    printf("\ndata = %d\n", data);








    

    

    

    

    

    

    

    

    




    

    return 0;

}


0 0