文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 663
阅读 4
收藏 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;
}

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/11/28/1342966.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
浅谈并行编程语言 Unified Parallel C

并行编程和 Unified Parallel C 语言概述 并行编程介绍 并行编程是通过同步执行计算机指令的方式来取得比串行编程更快速度的一种编程方法。并行编程是相对于传统的串行编程而提出的概念。在串...

鉴客
2011/01/08
1K
0
C++和Java的区别

转自:http://club.topsage.com/thread-265349-1-1.html Java并不仅仅是C++语言的一个变种,它们在某些本质问题上有根本的不同:   (1)Java比C++程序可靠性更高。有人曾估计每50行C++程序...

Rachy1989
2017/04/26
0
0
【原创翻译】深度剖析Go数据结构

当向一个新程序员解释Go语言时,我发现如果解释Go的数据是如何在内存中表示的,将有助于建立编写高效程序的良好直觉。 基础类型 让我们从一些简单的例子开始: 变量i是int类型,在内存中占用...

zingscript
2014/01/21
592
3
学习大数据为什么最好有java语言基础?

  本文需要5分钟左右阅读完成,建议收藏以后阅读,里面都是干货,可以亲自试验一下,如果觉得好用可以帮忙点赞转发一下,谢谢!交流学习java大数据可以加群460570824。   计算机编程语言...

java分享
2017/12/18
0
0
计算机专业C语言编程学习重点:指针化难为易

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

小辰带你看世界
2018/05/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TiDB 源码阅读系列文章(二十四)TiDB Binlog 源码解析

作者:姚维 TiDB Binlog Overview 这篇文章不是讲 TiDB Binlog 组件的源码,而是讲 TiDB 在执行 DML/DDL 语句过程中,如何将 Binlog 数据 发送给 TiDB Binlog 集群的 Pump 组件。目前 TiDB 在...

TiDB
23分钟前
1
0
Oracle第三方工具PLSQL注册码

注册码: Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqz serial Number:601769 password:xs374ca 这个注册码是PLSQL 11版本通用的,刚刚在官网下载了最新版11.0.6版,用 此激活码成功...

小橙子的曼曼
25分钟前
1
0
深度学习为图片人物换装【python代码教程】

在观看本文之前,请答应我要善良。昨天预告了下,发现很多同学对这个模型都表示出兴趣,甚至有好多同学后台发来照片让我帮他们脱裤子。授人以鱼不如授人以渔,请这些同学好自为之~ 01效果演示...

阿里云官方博客
45分钟前
6
0
centos7安装RabbitMQ详细过程

由于RabbitMQ是基于Erlang语言开发,所以在安装RabbitMQ之前,需要先安装Erlang 1、环境: centos 7.1 内核版本3.10.0-229.el7.x86_64 Erlang 19.0.4版本 RabbitMQ 3.6.14版本 2、在线安装E...

秋至丶枫以落
今天
1
0
6个使用KeePassX保护密码的技巧

虽然安全是个深奥的主题,但是你可以遵循几个简单的日常习惯来减小攻击面。本文将解释确保密码信息安全的重要性,并给出如何充分利用KeePassX的建议。 日益互联的数字世界使安全成为一个重要...

Linux就该这么学
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部