文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 663
阅读 2
收藏 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
【原创翻译】深度剖析Go数据结构

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

zingscript
2014/01/21
579
3
C++和Java的区别

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

Rachy1989
2017/04/26
0
0
学习大数据为什么最好有java语言基础?

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

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

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

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

没有更多内容

加载失败,请刷新页面

加载更多

win32截屏并rgb24转yuv420

//最终f的内存布局为BGRA格式,需要保证buf长度足够(>w*h*4)void ScreenCap(void* buf, int w, int h){ HWND hDesk = GetDesktopWindow(); HDC hScreen = GetDC(hDesk); ......

styleman
今天
1
0
php输出mysql取出的中文为??的问题

解决方法: @ $db=new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DB); $db->query("set names utf8");//添加此语句,可以解决问题...

Aomo
今天
1
2
白话SpringCloud | 第五章:服务容错保护(Hystrix)

前言 前一章节,我们知道了如何利用RestTemplate+Ribbon和Feign的方式进行服务的调用。在微服务架构中,一个服务可能会调用很多的其他微服务应用,虽然做了多集群部署,但可能还会存在诸如网...

oKong
今天
2
0
【解惑】领略Java内部类的“内部”

内部类有两种情况: (1) 在类中定义一个类(私有内部类,静态内部类) (2) 在方法中定义一个类(局部内部类,匿名内部类) 1、私有内部类 —— 在方法之间定义的内部类,非静态 我们首先看看类中...

偶尔诗文
今天
1
0
sqlserver 2008 r2 直接下载地址(百度云)

之前下载的sqlserver2008发现不能附加,就卸载了,重新找到了sqlserver2008R2的百度云资源 卸载sqlserver2008还是有点麻烦,不过就是需要删除注册表中的信息 自己来回卸载了3次终于重装sqlse...

dillonxiao
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部