C语言realloc()函数:重新分配内存空间
头文件:#include <stdlib.h>
realloc() 函数用来重新分配内存空间,其原型为:
void* realloc (void* ptr, size_t size);
【参数说明】ptr 为需要重新分配的内存空间指针,size 为新的内存空间的大小。
realloc() 对 ptr 指向的内存重新分配 size 大小的空间,size 可比原来的大或者小,还可以不变(如果你无聊的话)。当 malloc()、calloc() 分配的内存空间不够用时,就可以用 realloc() 来调整已分配的内存。
如果 ptr 为 NULL,它的效果和 malloc() 相同,即分配 size 字节的内存空间。
如果 size 的值为 0,那么 ptr 指向的内存空间就会被释放,但是由于没有开辟新的内存空间,所以会返回空指针;类似于调用 free()。
几点注意:
【返回值】分配成功返回新的内存地址,可能与 ptr 相同,也可能不同;失败则返回 NULL。
注意:如果分配失败,ptr 指向的内存不会被释放,它的内容也不会改变,依然可以正常使用。
代码示例:
Enter an integer value (0 to end): 23
Enter an integer value (0 to end): 45
Enter an integer value (0 to end): 23
Enter an integer value (0 to end): 67
Enter an integer value (0 to end): 0
Numbers entered: 23 45 23 67 0
上面的代码提示用户输入若干个数字(输入 0 结束)。每次输入新的数字,numbers 指向的内存空间就会增长 sizeof(int) 的长度。
realloc() 函数用来重新分配内存空间,其原型为:
void* realloc (void* ptr, size_t size);
【参数说明】ptr 为需要重新分配的内存空间指针,size 为新的内存空间的大小。
realloc() 对 ptr 指向的内存重新分配 size 大小的空间,size 可比原来的大或者小,还可以不变(如果你无聊的话)。当 malloc()、calloc() 分配的内存空间不够用时,就可以用 realloc() 来调整已分配的内存。
如果 ptr 为 NULL,它的效果和 malloc() 相同,即分配 size 字节的内存空间。
如果 size 的值为 0,那么 ptr 指向的内存空间就会被释放,但是由于没有开辟新的内存空间,所以会返回空指针;类似于调用 free()。
几点注意:
- 指针 ptr 必须是在动态内存空间分配成功的指针,形如如下的指针是不可以的:int *i; int a[2];会导致运行时错误,可以简单的这样记忆:用 malloc()、calloc()、realloc() 分配成功的指针才能被 realloc() 函数接受。
- 成功分配内存后 ptr 将被系统回收,一定不可再对 ptr 指针做任何操作,包括 free();相反的,可以对 realloc() 函数的返回值进行正常操作。
- 如果是扩大内存操作会把 ptr 指向的内存中的数据复制到新地址(新地址也可能会和原地址相同,但依旧不能对原指针进行任何操作);如果是缩小内存操作,原始据会被复制并截取新长度。
【返回值】分配成功返回新的内存地址,可能与 ptr 相同,也可能不同;失败则返回 NULL。
注意:如果分配失败,ptr 指向的内存不会被释放,它的内容也不会改变,依然可以正常使用。
代码示例:
#include <stdio.h> #include <stdlib.h> int main () { int input,n; int count = 0; int* numbers = NULL; int* more_numbers = NULL; do { printf ("Enter an integer value (0 to end): "); scanf ("%d", &input); count++; more_numbers = (int*) realloc (numbers, count * sizeof(int)); if (more_numbers!=NULL) { numbers=more_numbers; numbers[count-1]=input; }else { free (numbers); puts ("Error (re)allocating memory"); exit (1); } } while(input!=0); printf ("Numbers entered: "); for (n=0;n<count;n++) printf("%d ",numbers[n]); free (numbers); system("pause"); return 0; }运行结果:
Enter an integer value (0 to end): 23
Enter an integer value (0 to end): 45
Enter an integer value (0 to end): 23
Enter an integer value (0 to end): 67
Enter an integer value (0 to end): 0
Numbers entered: 23 45 23 67 0
上面的代码提示用户输入若干个数字(输入 0 结束)。每次输入新的数字,numbers 指向的内存空间就会增长 sizeof(int) 的长度。