文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 663
阅读 2
收藏 0
点赞 0
评论 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
学习大数据为什么最好有java语言基础?

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

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

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

小辰带你看世界
05/31
0
0
Go语言之数据类型总结

字符串:字符串是不可变的字节序列,本身就是一个复合结构。 头部指针指向字节数组,但是没有NULL结尾。默认以UTF-8编码存储Unicode字符,字面量里允许使用十六进制、八进制和UTF-8编码格式。...

棋帅小七
2017/12/23
0
0
JNI之C语言简单回顾

一.C语言基本数据类型: c语言中 char, int, float, double, signed, unsigned, long, short and void // java 中的8大本数据类型和他们的长度 // byte 1 char 2 short 2 int 4 long 8 double......

长平狐
2012/09/03
60
0
C语言祸根之看不见的错误,那些年学指针从入门到如土都是内存问题

前言 C 语言程序中的内存错误非常有害:它们很常见,并且可能导致严重的后果,最难受的极大多数时候内存问题看不见,也摸不着。编译正确运行出错,让新手从入门到入土,让老手也头痛不已,花...

这个人很懒什么都没留下
07/03
0
0
每周一书-编写高质量代码:改善C程序代码的125个建议

首先说明,本周活动有效时间为2016年8月28日到2016年9月4日。本周为大家送出的书是由机械工业出版社出版,马伟编著的《编写高质量代码:改善C程序代码的125个建议》。 编辑推荐   10余年开...

zting科技
2017/01/11
0
0
精选的这19道C/C+面试题,你能答对多少呢?

软件工程师的面试,套路都差不多,这一次约到的问题,下次你可能还会遇到。 问1:请用简单的语言告诉我C++ 是什么? 答:C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持...

悟空_b201
06/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

崛起于Springboot2.X之thymeleaf(24)

1、依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> 2、application.properties spring......

木九天
6分钟前
0
0
spring-boot:run启动时,指定spring.profiles.active

Maven启动指定Profile通过-P,如mvn spring-boot:run -Ptest,但这是Maven的Profile。 如果要指定spring-boot的spring.profiles.active,则必须使用mvn spring-boot:run -Drun.profiles=test......

夜黑人模糊灬
8分钟前
0
0
大数据分析挖掘技术学习:Python文本分类

引言 文本分类作为自然语言处理任务之一,被广泛应用于解决各种商业领域的问题。文本分类的目的是将 文本/文档 自动地归类为一种或多种预定义的类别。常见的文本分类应用如下: • 理解社交媒...

加米谷大数据
13分钟前
0
0
istio-0.8 指标监控,prometheus,grafana

配置: https://istio.io/docs/tasks/telemetry/metrics-logs/ https://istio.io/docs/tasks/telemetry/tcp-metrics/ envoy拦截请求>上报mixer>对接prometheus>grafana 效果截图: promethe......

xiaomin0322
15分钟前
0
0
公众号推荐

阿里技术 书籍:《不止代码》

courtzjl
17分钟前
0
0
关于改进工作效率

1.给不同的业务线建立需求群,所有的数据需求都在群里面提。 2.对于特别难搞定的事情,到对应的技术哪去做,有问题随时沟通。 3.定期给工作总结形成方法论。 4.学习新的技术,尝试用新的方法...

Avner
24分钟前
0
0
关于thinkphp 框架开启路径重写,无法获取Authorization Header

今天遇到在thinkphp框架中获取不到header头里边的 Authorization ,后来在.htaccess里面加多一项解决,记录下: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews Rewrite......

殘留回憶
28分钟前
0
0
centos 使用yum安装nginx后如何添加模块 10

centos 使用yum安装nginx后如何添加模块 10 centos6.2版本,使用yum来安装了nginx,但是最近需要重新添加模块,所以就傻了,询问下有人知道怎么重新添加模块吗? PS:俺是新手,需要高手救助...

linjin200
31分钟前
0
0
dubbo 资料

dubbo资料网站: https://www.cnblogs.com/a8457013/p/7818925.html

zaolonglei
32分钟前
0
0
大型网站,你是如何架构的?

大型网站,你是如何架构的?

微小宝
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部