文档章节

C语言学习—动态内存分配

紫电_清霜
 紫电_清霜
发布于 2015/10/19 17:48
字数 915
阅读 13
收藏 0
点赞 0
评论 0

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

栈区 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;
}




© 著作权归作者所有

共有 人打赏支持
紫电_清霜
粉丝 2
博文 10
码字总数 7921
作品 0
沈阳
小蚂蚁学习C语言(20)——C语言指针——动态内存分配认识

动态内存分配(十分重要) 1,传统数组的缺点 2,为什么需要动态分配内存 3,动态内存分配举例 ——动态数组的构造 4,静态内存和动态内存的比较 5,跨函数使用内存的问题 传统数组的缺点 1,...

嗜学如命的小蚂蚁 ⋅ 2015/12/16 ⋅ 0

C语言编程知识学习:if语句对出错的处理

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 05/15 ⋅ 0

小蚂蚁学习C语言(22)——C语言指针——多级指针和跨函数使用内存

多级指针:把指针变量的地址放入到另一个指针变量中去。 # include <stdio.h>int main(void){ int i = 5; /* 因为i是int类型,把它的指针赋值于p的时候, p需要是int类型的指针变量 int * / ...

嗜学如命的小蚂蚁 ⋅ 2015/12/18 ⋅ 0

小蚂蚁学习C语言(1)——C语言概述

C语言概述 1. 为什么学习C语言 C的起源和发展 1 第一代语言:机器语言 0101 2 第二代语言:汇编语言 add 1,2 3 第三代高级语言: C语言产生和发展过程: 产生时间:1972-1973 产生地点:美国...

嗜学如命的小蚂蚁 ⋅ 2015/11/26 ⋅ 4

链表的C语言实现(含动态内存分配)

链表的C语言实现(含动态内存分配) 上 链表的C语言实现之动态内存分配 一、为什么用动态内存分配 但我们未学习链表的时候,如果要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

[从C到C++] 1.9 C++ new和delete操作符

在C语言中,动态分配和释放内存的函数是malloc、calloc和free,而在C++语言中,new、new[]、delete和delete[]操作符通常会被用来动态地分配内存和释放内存。 需要注意的是new、new[]、delet...

wu_being ⋅ 06/16 ⋅ 0

C语言变量声明内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译...

AlphaJay ⋅ 2010/06/26 ⋅ 0

c与c++分别是怎样动态分配和释放内存的,有什么区别

C语言 c语言提供内存动态分配的函数有:malloc、calloc、realloc,在使用这些函数时必须包含其头文件,分别为: 1) malloc 函数: 在内存的动态分配区域中分配一个长度为size的连续空间,如果...

NineRec ⋅ 2014/09/13 ⋅ 0

操作系统from清华大学向勇,陈渝 笔记(一)绪论

操作系统operating system(OS)清华大学向勇,陈渝 笔记 上课视频来源,B站 搜操作系统 96P的那个 UP主真乃分P狂魔!!! 下篇和下下篇在这里 二 操作系统的启动、中断、异常、系统调用 三 ...

github_36487770 ⋅ 2017/02/08 ⋅ 0

c执行文件内存布局

c语言在嵌入式、操作系统、图像处理方面应用广泛,是一种比较底层的语言。本文主要介绍c语言的内存分配,进程在内存中的布局。 环境: Linux zhuzhu 4.2.0-27-generic #32~14.04.1-Ubuntu S...

菏泽小朱 ⋅ 2016/10/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 42分钟前 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部