文档章节

学点 C 语言(23): 数据类型 - 给指针分配内存

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 663
阅读 17
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>


C 语言的内存分配很简单: malloc、calloc、realloc、free

malloc(字节数); 返回内存段的首地址, void 的.

calloc(个数, 类型大小); 和 malloc 的区别就是它会初始化内存为空.

realloc(原指针, 字节数); 重新分配由 malloc、calloc 分配的内存; 这里有太多注意事项:
1、如果缩小了, 会截掉一块, 会保留前面的内容;
2、如果扩大了, 仍会保留已有的内容, 但新加的内存不会初始化;
3、在扩大时, 有可能内存地址会变化, 这样原来的指针就废了, 不过返回值是新指针, 所以继续使用的应该是返回值.

如果分配失败会返回 NULL, 一般是因为内存不足; 分配 0 字节内存也会返回 NULL 但这没有意义.

它们都是用 free(指针) 释放.


1. 给一个整数分配内存:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *p = NULL;

//    p = malloc(sizeof(int));  /* 应该像下一句同时类型转换, 不然在 C++ 里面不行 */
    p = (int *)malloc(sizeof(int));
    
    *p = 100;
    printf("%d\n", *p);
    
    free(p);
    
    getchar();
    return 0;
}

 
 
 
 
 

 

 

  

2. 给 3 个整数分配内存:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *p = NULL;
    
    p = (int *)malloc(sizeof(int)*3);
    
    *p = 111;
    *(p+1) = 222;
    *(p+2) = 333;

    printf("%d,%d,%d\n", *p, *(p+1), *(p+2));

    free(p);
    getchar();
    return 0;
}

 
 
 
 
 

 

 

  

3. 像数组一样使用:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *p = (int *)malloc(sizeof(int)*3);

    p[0] = 111;
    p[1] = 222;
    p[2] = 333;

    printf("%d, %d, %d\n", p[0], p[1], p[2]);

    free(p);
    getchar();
    return 0;
}

 
 
 
 
 

 

 

  

4. calloc 会同时初始化内存, malloc 则不会, 不初始化应该更快些:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    const int num = 10;

    // calloc 和 malloc 参数也有点区别
    long *p1 = (long *)calloc(num, sizeof(long));  /* 会初始化   */
    long *p2 = (long *)malloc(num * sizeof(long)); /* 不会初始化 */

    int i;
    for (i = 0; i < num; i++) {
        printf("%d, %d\n", p1[i], p2[i]);
    }

    free(p1);
    free(p2);
    getchar();
    return 0;
}

 
 
 
 
 

 

 

  

5. realloc:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int num = 10;
    int i;
    
    long *p = (long *)malloc(num * sizeof(long));
    printf("内存地址: %p\n~~~~~~~~\n", p);
    
    for (i = 0; i < num; i++) p[i] = i+1;
    for (i = 0; i < num; i++) printf("%d\n", p[i]);

    printf("------------------\n");

    num = 4;
    p = (long *)realloc(p, num*sizeof(long));
    printf("内存地址: %p\n~~~~~~~~\n", p);
    for (i = 0; i < num; i++) printf("%d\n", p[i]);

    printf("------------------\n");

    num = 20;
    p = (long *)realloc(p, num*sizeof(long));
    printf("内存地址: %p\n~~~~~~~~\n", p);
    for (i = 0; i < num; i++) printf("%d\n", p[i]);

    free(p);
    getchar();
    return 0;
}

 
 
 
 
 

 

 

  

6. 判断内存是否分配成功:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *p = (int *)malloc(100);

    if (p != NULL) printf("分配成功!\n");
    if (p) printf("分配成功!\n");

    if (p == NULL) printf("内存不足!\n");
    if (!p) printf("内存不足!\n");

    free(p);
    getchar();
    return 0;
}

 
 
 
 
 

 

 

  

涂孟超
粉丝 13
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
加载中
请先登录后再评论。
C语言入门到精通视频教程|C语言教程

课程观看地址:http://www.xuetuwuyou.com/course/64 课程出自学途无忧网:http://www.xuetuwuyou.com/course/64 课程介绍 一、课程用到的软件:Window VC6.0 / Ubuntu VIM gcc 二、课程涉及...

相思苦闷
2015/12/31
51
0
博客总目录(2007.11.12 - 2010.4.25)

如果我的学习记录和历程能对你有所帮助, 我非常高兴; 但是 -- "万一" 不是高手、更不是大师, 只是利用工作之余学点东西, 并感觉学得挺吃力. 内容都是写时才会, 难免稚嫩, 所以 "仅供参考" 可...

涂孟超
2014/09/26
49
0
带你学够浪:Go语言基础系列 - 8分钟学复合类型

★ 文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定。可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇)” 对于一般的语言使用者来说 ,2...

osc_oa9f94a9
06/17
4
0
C 语言编程 — 内存管理

目录 文章目录 目录 前文列表 堆、栈 内存管理 动态分配内存 重新调整内存的大小和释放内存 前文列表 《程序编译流程与 GCC 编译器》 《C 语言编程 — 基本语法》 《C 语言编程 — 基本数据类...

osc_y2vnam1e
04/05
19
0
内存四区解析

1,数据类型本质 1.1,数据类型可以理解为是创建变量的模子:是规定内存大小的别名 1.2,数据类型的作用:编译器预算对象(变量)分配内存大小 2,void的意义 2.1、void 的字面意思是“无类型...

LVLUP
2016/01/08
10
0

没有更多内容

加载失败,请刷新页面

加载更多

程序员必备之终端模拟器,让你的终端世界多一抹“颜色”

作者:HelloGitHub-ChungZH 当你逐渐厌倦了 cmd 的枯燥黑屏、powershell 的单调蓝底,可以来尝试一下使用可定制性更高的终端模拟器。下面是 HelloGitHub 从 GitHub 上收集的一些开源终端模拟...

osc_rbml5ydi
26分钟前
9
0
饿了么交易系统 5 年演化史

Photo @ Bluehouse Skis 文 | 挽晴 个人简介: 2014年12月加入饿了么,当时参与后台系统的研发(Walis+Javis=>Walle),主要面向客服和BD。 2015年5月开始接触订单系统的研发,7月负责订单研发组...

osc_lhmderwy
27分钟前
9
0
pip安装第三方库,加入清华镜像源的方法

pip install 库名称 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

云烟成雨forever
28分钟前
11
0
三.Activity启动流程-AMS请求Zygote启动进程过程

。。。。

osc_116hbwph
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部