文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 663
阅读 3
收藏 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
579
3
计算机专业C语言编程学习重点:指针化难为易

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

小辰带你看世界
05/31
0
0
学习大数据为什么最好有java语言基础?

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

java分享
2017/12/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

babel6升级到7,jest-babel报错:Requires Babel "^7.0.0-0", but was loaded with "6.26.3".

自从将前端环境更新到babel7,jest-babel之前是基于babel6的,执行时候就会报:Requires Babel "^7.0.0-0", but was loaded with "6.26.3". 很烦,因为连续帮好几台电脑修复这个问题,所以记...

曾建凯
16分钟前
0
0
探索802.11ax

802.11ax承诺在真实条件下改善峰值性能和最差情况。 如何改善今天的Wi-Fi? 在决定如何改进当前版本以外的Wi-Fi时,802.11ac,IEEE和Wi-Fi联盟调查了Wi-Fi部署和行为,以确定更广泛使用的障碍...

linuxprobe16
今天
2
0
使用linux将64G的SDCARD格式化为FAT32

一、命令如下: sudo fdisk -lsudo mkfs.vfat /dev/sda -Isudo fdisk /dev/sda Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to wri......

mbzhong
今天
4
0
深入理解Plasma(四):Plasma Cash

这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等。本篇文章主要介绍在 Plasma 框架下的项目 Plasma Cash。 深入理解Plasma(1):...

HiBlock
昨天
1
0
命令参数的三大风格:Posix、BSD、GNU

今天读到命令行中参数的风格有三大类,即Unix/Posix、BSD、GNU。分别有以下特征: Unix/Posix风格,即命令后的参数,可以分组,便必须以连字符开头,如ps -aux。 BSD风格,即命令后的参数,可...

大别阿郎
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部