c语言分配动态存储空间吗,C语言动态数组与内存分配,calloc与malloc的区别

C语言中如何实现动态数组:

​方法一:

int n;

......

int array[n];

方法二:

int n;

......

int *p;

p=(int*)malloc(n*sizeof(int));

int *p1;

p1=(int*)calloc(n,sizeof(int));​

二维数组:

int (*p2)[6];//在c99之前可以使用

p2=(int (*)

[6])malloc(n*6*sizeof(int));​//n*6的数组

int col,row;

.....

int (*p3)[col] = (int

(*)[])malloc(row*col*sizeof(int));//要求变长数组支持,在c90是不可以用的,c99可以使用

malloc与calloc区别:​

malloc,calloc和free都在中

C语言分配内存有三种方式:

1.静态分配:在程序运行之前就已经分配好(编译阶段),例如全局变量,static变量。当整个程序结束时销毁。

2.栈的分配:在程序​运行中,分配栈内存给函数的局部变量,当这段函数运行结束时自动释放。例如auto变量。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

3.​动态分配:在程序运行时,有程序员代码决定内存的分配和释放。用free释放,注意内存泄漏。当程序结束时,也会全部释放内存。优点:灵活。缺点:动态分配过程中,可能使内存碎片化,从而导致进程比使用栈内存而慢。

void

malloc(要分配内存的大小以字节计算),在ANSI之前版本,返回一个char。在ANSIC中返回void指针,如果没有找到内存可以分配返回NULL指针​​。​

void calloc(内存单元的数量,每个单元的大小以字节计算);​

calloc,

在ANSI之前版本,返回一个char指针,在ANSI返回一个void指针​​​

分配成功的指针指在所分配内存的起始处。

他们的主要区别是:​​

calloc会对分配的内存进行初始化,块中的全部位置设置为零。(在某些系统中,浮点数0的初始值,并不是全部用0来表示的)。​​

realloc有个细节需要注意:

无非就是将已经存在的一块内存扩大。

char* p = malloc(1024);

char* q = realloc(p,2048);

现在的问题是我们应该如何处理指针 p。 刚开始按照我最直观的理解,如果就是直接将 p = NULL;。 到最后只需要释放

q的空间就可以了。

因为最近在做个封装。结果在做单元测试的时候发现。有时候我在 free(q); 的时候会出错。这样我就郁闷了。

后来仔细一跟踪,发现 realloc 完以后 q 和 p 的指针地址是一样。不过有时候又不一样。

仔细查了下资料。得到如下信息:

1.如果 当前连续内存块足够 realloc 的话,只是将p所指向的空间扩大,并返回p的指针地址。 这个时候 q 和 p

指向的地址是一样的。

2.如果

当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p指向的内容 copy到 q,返回

q。并将p所指向的内存空间删除。

这样也就是说 realloc 有时候会产生一个新的内存地址 有的时候不会。所以在分配完成后。我们需要判断下 p 是否等于

q。并做相应的处理。

这里有点要注意的是要避免 p = realloc(p,2048); 这种写法。有可能会造成 realloc

分配失败后,p原先所指向的内存地址丢失。​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值