编写 C/C++ 程序时,经常需要申请内存,内存的申请与释放也是在编写程序中最需要注意的地方。和 Python 等程序不同的是,C/C++ 将内存的申请与释放的权限交给了程序员,如果程序员忘记了释放已经申请的内存,那么在程序运行结束前它会一直占据这个空间。随着程序的运行,有可能会占据的内存越来越多,最终导致系统崩溃。因此每次申请内存的时候,都不要忘记在合适的地方释放掉。本文主要介绍申请内存的几种方法,这些不同的方法各有其适用的场景,读者可以根据自己的实际情况进行选择。
-
首先是 malloc 函数,该函数的原型是 void *malloc(size_t size); 功能是分配 size 字节的未初始化内存块,如果成功分配,则返回数组的地址,否则返回 NULL。这个函数对于大部分程序员来说都是比较熟悉的,需要特别注意的有两点:第一点是该函数的返回值是 void * 类型,因此对于特定的数据类型,需要进行强制类型转换;第二点是这个函数只负责分配内存,并不会进行初始化操作,因此不可以直接引用内存块的值。
-
然后是 realloc 函数,该函数的原型是 void *realloc(void *ptr, size_t size); 函数功能是将 ptr 指向的内存块大小改为 size 字节,但是内存块内原来的数据都不会发生变化,新增加的内存块仍然是未被初始化的。
-
还有 calloc 函数,该函数的原型是 void *calloc(size_t nmem, size_t size); 函数的功能是为含有 nmem 个成员的数组分配空间,每个元素占 size 字节大。和前面两个函数不同的是,该函数可以将每个内存块初始化为0。
-
最后是 new 运算符,它在 C++ 程序中经常被使用。相比于前面几种申请内存的方法,使用 new 运算符不需要进行强制类型转换。在使用完这段内存空间之后,需要使用 delete 运算符将其释放掉。
下面通过一段程序来看一下它们的具体使用方法:
#include#include#includeusing namespace std;int main(){ int *a,*b; int i; a=(int *)malloc(sizeof(int)*4); assert(a); for (i=0;i<4;i++) a[i]=i+1; a=(int *)realloc(a,sizeof(int)*6); a[4]=5; a[5]=6; for (i=0;i<6;i++) cout<<"a["<"]="< cout<<endl; free(a); a=(int *)calloc(4,sizeof(int)); assert(a); for (i=0;i<4;i++) cout<<"a["<"]="< cout<<endl; free(a); b=new int[4]; for (i=0;i<4;i++) b[i]=(i+1)*(i+1); for (i=0;i<4;i++) cout<<"b["<"]="< cout<<endl; delete []b;}
下面是这段代码的运行结果:
可以看到,在使用 calloc 函数申请内存之后,每个数组成员的值都被设置为了0。因此为了避免引用未初始化的内存块,建议使用 calloc 函数。
有时候,需要对一个数组进行清零操作,常规的方法是使用循环,然后在循环内部进行赋值。但是当循环次数过多的时候,效率就比较低了。可以使用 memset 函数实现这一操作,该函数的原型是 void *memset(void *s, int ch, size_t n); ch 即是要初始化的值,n 是这段内存空间的大小。由于该函数存在于 string.h 头文件中,因此只有包含了这个头文件才可以使用这个函数。通过下面的程序了解下它的用法:
#include#include#includeusing namespace std;int main(){ int *a; int i; a=new int[4]; for (i=0;i<4;i++) a[i]=i+1; for (i=0;i<4;i++) cout<<"a["<"]="< cout<<endl; memset(a,0,sizeof(int)*4); for (i=0;i<4;i++) cout<<"a["<"]="< cout<<endl; delete []a;}
下面是这段程序的运行结果:
memset 函数不仅可以进行清零操作,还可以用来为新申请的内存进行初始化。它是对较大的结构体或数组进行清零操作的一种最快方法。
以上介绍的各种申请内存空间的函数都有其适用的场景,请读者根据合适的情况进行选择,不必要一定使用 malloc 函数。无论是什么时候,都不要忘记释放掉申请的内存哦,即便是程序非常短,申请的空间很小,也要养成一个好习惯。俗话说,“好借好还,再借不难。”如果一直赖着不还的话,系统就会崩溃了hhh。
1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态
内存
分配。原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的
内存
块。如果分配成功则返回指向被分配
内存
的指针,分配失败返回空指针NULL。当
内存
不再
使用
时,应
使用
free()函数将
内存
块
释放
。
1.2 void *malloc(int size); 说明:malloc 向系统
申请
分配指定size个字节的
内存
空间,返回类型是 void* 类型。void* 表示
未
确定类型的指针。C,C++规定,void* 类型可以强
版本声明:本文转载于公众号TeachPlus指针的
使用
,一直是c语言面试题中必考的部分,因为指针本身
使用
的复杂性与普适性,所以考点非常多,而且也可以与其他知识相互结合,因此我们将会
使用
五篇专题的篇幅来介绍指针。分析下面的程序,指出程序中的错误:[cpp] view plain copy# include <stdio.h> int main( void) { char ...
取消引用
未
知的
内存
位置:C程序员大多
使用
scanf()函数来获取输入,但是有时一个小错误可能会带来错误,甚至使整个程序崩溃。scanf()的语法为scanf(“%d”,&a);。。有可能错过与和写入&A作为所以现在的scanf(“%d”,一); 正在取消引用到
未
知位置。现在,该程序可能会异常终止,或者可能对应于有效位置(与当前程序无关,但与某些其他程序无关),并且可能被覆盖,这可能在以后导致
未
知效...
当我们
使用
未
初始化
的
内存
指针时,会导致程序无法进行,因为指针并没有指向一个合法的地址,这时候其内部存的只是一些乱码。所以在调用函数时,会
使用
乱码所指的
内存
,指针根本就无权访问,导致出错。
看一段代码
#include<stdio.h>
void getvalue(float x, float y, float* sum); //计算两个浮点数的和
int main()
float a, b;
float* sum;
scanf_s("%f%f", &a, &b);
C语言中
内存
的管理与
使用
—堆与栈
内存
管理是计算机学习编程的一个重要知识,也是令大多数程序员比较头疼的一个知识。由于在目前的嵌入式系统中资源仍然是有限的,所以对
内存
的管理就显得尤为重要。C语言程序的
内存
接口简单,
内存
管理灵活,所以是初学者容易出错的知识,下面就让我们分三篇文章进行讲解,这篇文章主要讲解的是
内存
管理中的堆与栈。1、堆与栈的区别栈:由系统自动分配的
释放
,用来存放函数的参数、局部变量的值。...
超过10万人正在关注赶快来关注吧,这里有你想找的热点资讯,这里有你想要的各种资料,还有海量的资源,还在等什么。快来关注,大佬带你开车。电脑
内存
不足怎么办,虚拟
内存
能起到多大作用?我们可以看到下图网友反映"电脑
内存
有12GB
内存
,但是玩大型游戏的时候,经常弹出
内存
不足的窗口,导致游戏经常崩溃"。怎么回事呢?其实跟我们今天聊的话题很契合,物理
内存
和虚拟
内存
有什么区别?那么虚拟
内存
有什么作用呢...
经常在用电脑的时候,有时候会出现电脑
内存
不足怎么办。说
内存
不足一般是指虚拟
内存
不足,有时是指C盘空间不足,有时中了木马也会提示
内存
不足。一、查看系统和软件所占用的
内存
情况1、打开系统的任务管理器,点击上方的【性能】,查看当前
内存
使用
情况,如下图所示;2、从这里可以看出来,我的
内存
可能空间不多。所以当我继续再打开另外一些程序的话,可用
内存
会越小,然后系统的反应也会越来越慢。这时,我们可以切换到任务管...
内存
做为电脑三大件配件之一,担负着数据的临时存取等任务。在
使用
过程中,难免会出现一些问题,如启动电脑却无法正常启动、无法进入操作系统或运行应用软件、无故经常死机等故障,这些问题的产生常会因为
内存
出现异常故障而导致操作失败。
内存
出现问题一部分是因为升级
内存
,由于
内存
种类的不匹配,往往也会遇到一些问题;另一部分是
内存
在
使用
过程中,金手指与主板的插槽接触不良引起或者是中了病毒等原因引起的问题。此
之前在学Java的时候对于Java虚拟机中的
内存
分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的
内存
分配了解的太少。
问题不能拖,我这就来学习一下吧,争取一次搞定。在任何程序设计环境及语言中,
内存
管理都十分重要。
内存
管理的基本概念
分析C语言
内存
的分布先从Linux下可执行的C程序入手。现在有一个简单的C源程序hello.c
1 #include <stdio....