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

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

猜你喜欢

转载自blog.csdn.net/qq_33775402/article/details/78509743