C语言学习—动态内存分配
C语言学习—动态内存分配
紫电_清霜 发表于2年前
C语言学习—动态内存分配
  • 发表于 2年前
  • 阅读 10
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 存储区划分 对内存分配函数 其他内存分配函数 内存操作函数

一. 存储区划分(地址由高到低)

栈区 int a = 3;
堆区 malloc(255)
静态区 static float h = 1.36
常来区 "sdk"
代码区 void func(){...}

注意:    

    栈内存:栈内存返回是不安全的,禁止!!!

    常量区:常量占用内存,只读状态,决不可修改!

    静态存储区:1.只初始化一次

                    2.如果初始化没值,默认值0

                    3.只有程序退出才释放

            将变量定义的类型前加static,则该变量存储在静态存储区

    堆区:手动分配,手动释放

    代码区:所有的语句编译后会生成CPU指令存储在代码区

二.堆内存分配函数

    动态内存分配

            void *malloc(unsigned int size);

            *返回分配完的内存的首地址,size需要分配的字节数,因是参数,可以写成表达式.可以根据需求运行期分配内存.

    malloc使用

        1. char *str = malloc(8);

            strcpy(str, "sdf");使用刚刚分配的内存,存储数据

         2. int *arr = malloc(4);

            short *sarr = malloc(4);

            arr分配一块内存可存放一个int型元素,sarr可存放两个short型元素

          3. Student *p = malloc(sizeof(Student));

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

                分配一个结构体内存和分配一个结构体数组的内存

      内存释放

            void free(void *);

            free函数作用是释放内存,内存释放是标记删除.

三.其他内存分配函数

   calloc

        void * calloc(unsigned n,unsigned size);

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

    realloc

         void *realloc(void *p, unsigned newSize);

          按给定的地址以及给定的大小重新分配        

四. 内存操作函数

    初始化内存

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

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

    内存拷贝

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

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

    内存比较

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

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

 练习代码:  

    1.输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值。

int main()
{
   int x = 0;
    scanf("%d", &x);//输入数组长度
    
    //动态分配
    int *p = malloc(sizeof(int) * x);
    int *head = p;//指向数组的首地址
    //生成随机数,保存在数组中
    for (int i = 0; i < x; i ++) {
        *p ++ = arc4random() % (40 - 20 + 1) + 20;
    }
    int max = 0;//用于保存最大值
    for (int i = 0; i < x; i ++) {
    //查找最大值
        if (max < head[i]) {
            max = head[i];
        }
        //输出数组
        printf("%d ", head[i]);
    }
    //输出最大值
    printf("\nmax = %d ", max);
    //释放空间
    free(head);
    //指针置空
    head = NULL;
    p = NULL;
    return 0;
}

2.有一段文本,将文本中的所有单词,存放到一个字符串数组中。(要求占用内存最少)

 int main()
 {
    char str[] = "s    sdfs   sdf   af asfadsf    ads f asd fa sdf as ddbv";
    char tempStr[20] = {0};//暂存单词
    char *p[255] = {0};//存储栈区空间地址
    int i = 0;//str下标
    int j = 0;//tempStr下标
    int k = 0;//指针数组下标
    
    while (1) {
        //获取一个单词
        if (str[i] != ' ' && str[i] != '\0') {
            tempStr[j ++] = str[i];
            //一个单词结束
        } else if (j != 0){
        //当遇到空格,或者\0时,单词的存放结束
            tempStr[j] = '\0';
            p[k] = malloc(strlen(tempStr) + 1);
            strcpy(p[k], tempStr);
            k ++;
            j = 0;//存储下一个单词
        }
        //while出口,str被遍历完成
        if (str[i] == '\0') {
            break;
        }
        i ++;//移动str数组中的下一个元素
    }
    for (int i = 0; i < k; i ++) {
        printf("%s ", p[i]);
        free(p[i]);
        p[i] = NULL;
    }
    return 0;
}




标签: 动态内存分配
共有 人打赏支持
粉丝 3
博文 10
码字总数 7921
×
紫电_清霜
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: