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