动态内存(二)calloc 和 realloc && 使用动态内存

来源:互联网 发布:做个文明中国人 知乎 编辑:程序博客网 时间:2024/05/16 16:23

Pointers or C 英文版翻译

11.3 Calloc and Realloc

另外还有两个内存分配函数,calloc 和 realloc,他们的原型如下:

void *  calloc(size_t num_elements,size_t element_size);void *  realloc(void* ptr,size_t new_size);

calloc 也是用来分配内存的。malloc 和 calloc 的主要区别是,后者在返回指向分配的内存的指针前将内存初始化为0。这初始化是很方便的 ,但是如果你的程序首先做的事是在数组中存入值,那么使用calloc 是很浪费时间的。calloc 和 malloc 的较小的不同是请求内存数量的方式不同。calloc 获取 所需的元素的数量和每个元素的字节数。通过这些值来计算需要多少字节。


realloc 被用来修改之前被分配的内存的大小。你可以用这个函数使内存块扩大或者缩小。如果扩大一块内存,那么它旧的内存的内容不会改变,然后新加的内存添加在之前内存的末尾。新内存是没有经过任何初始化的。如果内存块被划分的很小,那么内存被截断,先前剩余的部分不会被改变。


如果原先的内存大小不能被调整,realloc 将分配一个正确大小的内存,并且把就内存中的内容拷贝到新的内存中。因此,在调用realloc 后一定不要再使用指向内存块的旧指针。使用新的指针代替旧的它。


最后,如果realloc 的第一个参数为NULL,那么它的行为很像malloc 。


11.4 Using Dynamically Allocated Memory

11.4 使用动态分配的内存

这儿是一个通过 malloc 获取一块内存的栗子。

int * pi;pi=malloc(100);if(pi!=NULL){    printf("out of menory !\n");    exit(1);}

NULL符号作为字面常量0 被定义在 stdio.h 中。它被用来在视觉上提醒被测试的是指针类型,而不是整型。


如果这些内存是可用的,我们将有一个指向100个字节的指针。在一个int类型是4个字节的机器上,这块内存将被看作25个int类型的数组,因为pi 是一个int 型指针。


提示:

如果你的目的是为了获得足够储存25个整型的内存,这儿有一个更好的方法获取它。

pi= malloc(25* sizeof(int));

这种方法更好一些,因为它是可移植的。它在不同大小的int型机器上可以很好的工作。


现在你有了指针,那么如何使用内存呢?当然,你可以使用解引用,并且使用指针算术存取这个数组中不同位置的整数,例如在一个循环中,把新分配的数组的每一个元素设置为0:

int * pi2,i;pi2 =pi;for(i=0;i<25;i++){    *pi2++ =0;}

正如你看到的,你一样可以对一个指针使用下标。这个第二个循环和之前哪一个工作一样。

int i;for(i=0;i<25;i++){    pi[i]=0;}

译者:小风code
时间:2017-11-11

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝做文胸的标题要怎么办 秋衣弹力衣服松了怎么办 假离婚变成真的怎么办 百家利钱不到账怎么办 皮鞋撑大了怎么办变小 鞋穿着走路掉跟怎么办 浅口帆布鞋大了怎么办 布鞋后鞋跟老掉怎么办 穿坡跟凉鞋容易打滑摔倒怎么办 运动鞋烂了个口怎么办 运动鞋的网烂了怎么办 运动鞋鞋一个一个高一个低怎么办 淘宝预售水果不发货怎么办 淘宝评价忘记晒图了怎么办 参加水果展没有实物怎么办 没做过运营面试怎么办 苹果5s16g内存满了怎么办 618天猫有活动淘宝没有怎么办 天猫国际买到假货怎么办 天猫恶意差评怎么办 天猫删除差评被扣分了怎么办 天猫收到差评怎么办 天猫给差评骚扰怎么办 天猫客户差评怎么办 天猫没法给差评怎么办 天猫上限购一件怎么办 拍下商品不发货怎么办 天猫红包过期了怎么办 买天猫店被中介骗了钱怎么办 速卖通假货纠纷怎么办 天猫新开店被恶意拍下怎么办 新开的天猫店没有生意怎么办 银行的支票丢了怎么办 天猫积分用光了怎么办 淘宝店没有无线流量怎么办 京东卖家不发货怎么办会自动打款 一件代发顾客如果退款怎么办 京东以前的账号怎么办 旺旺对话框订单页面变宽了怎么办 阿里巴巴店铺上传图片很模糊怎么办 天猫跨店优惠券用了退货怎么办