malloccallocrealloc
Posted 小李一米九
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了malloccallocrealloc相关的知识,希望对你有一定的参考价值。
文章目录
malloc
头文件:#include<stdlib.h>
malloc()函数用来动态地分配内存空间,其原型为:
void* malloc(size_t size);//size为需要分配的内存空间的大小,以字节(Byte)计。
【函数说明】malloc()在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值时未知的。如果希望在分配内存的同时进行初始化,请使用calloc()函数。
【返回值】分配成功返回指向该内存的地址,失败则返回NULL。
由于申请内存空间时可能有也可能没有,所以需要自行判断是否申请成功,再进行操作。
如果size的值为0,那么返回值会因标准库实现的不同而不同,可能是NULL,也可能不是,但返回的指针不应该再次被引用
注
意
:
函
数
的
返
回
值
类
型
是
v
o
i
d
∗
,
v
o
i
d
并
不
是
说
没
有
返
回
值
或
者
返
回
空
指
针
,
而
是
返
回
的
指
针
类
型
未
知
。
\\colorred注意:函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。
注意:函数的返回值类型是void∗,void并不是说没有返回值或者返回空指针,而是返回的指针类型未知。
所以在使用 malloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型,例如:
注意:函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。
动态内存分配举例:
#include <stdio.h> /* printf, scanf, NULL */
#include <stdlib.h> /* malloc, free, rand, system */
int main ()
int i,n;
char * buffer;
printf ("输入字符串的长度:");
scanf ("%d", &i);
buffer = (char*)malloc(i+1); // 字符串最后包含 \\0
if(buffer==NULL) exit(1); // 判断是否分配成功
// 随机生成字符串
for(n=0; n<i; n++)
buffer[n] = rand()%26+'a';
buffer[i]='\\0';
printf ("随机生成的字符串为:%s\\n",buffer);
free(buffer); // 释放内存空间
system("pause");
return 0;
运行结果:
输入字符串的长度:20
随机生成的字符串为:phqghumeaylnlfdxfirc
该程序生成一个指定长度的字符串,并用随机生成的字符填充。字符串的长度仅受限于可用内存的长度。
calloc
头文件:#include <stdlib.h>
calloc() 函数用来动态地分配内存空间并初始化为 0,其原型为:
void* calloc (size_t num, size_t size);
calloc() 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。
【返回值】分配成功返回指向该内存的地址,失败则返回 NULL。
如果 size 的值为 0,那么返回值会因标准库实现的不同而不同,可能是 NULL,也可能不是,但返回的指针不应该再次被引用。
注意:函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。所以在使用 calloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型,例如:
char *ptr = (char *)calloc(10, 10); // 分配100个字节的内存空间
calloc() 与 malloc() 的一个重要区别是:calloc() 在动态分配完内存后,自动初始化该内存空间为零,而 malloc() 不初始化,里边数据是未知的垃圾数据。下面的两种写法是等价的:
// calloc() 分配内存空间并初始化
char *str1 = (char *)calloc(10, 2);
// malloc() 分配内存空间并用 memset() 初始化
char *str2 = (char *)malloc(20);
memset(str2, 0, 20);
代码示例:
#include <stdio.h>
#include <stdlib.h>
int main ()
int i,n;
int * pData;
printf ("要输入的数字的数目:");
scanf ("%d",&i);
pData = (int*) calloc (i,sizeof(int));
if (pData==NULL) exit (1);
for (n=0;n<i;n++)
printf ("请输入数字 #%d:",n+1);
scanf ("%d",&pData[n]);
printf ("你输入的数字为:");
for (n=0;n<i;n++) printf ("%d ",pData[n]);
free (pData);
system("pause");
return 0;
运行结果:
要输入的数字的数目:4
请输入数字 #1:126
请输入数字 #2:343
请输入数字 #3:45
请输入数字 #4:234
你输入的数字为:126 343 45 234
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 必须是在动态内存空间分配成功的指针,形如如下的指针是不可以的:int *i; inta[2];会导致运行时错误,可以简单的这样记忆:用 malloc()、calloc()、realloc() 分配成功的指针才能被 realloc() 函数接受。
- 成功分配内存后 ptr 将被系统回收,一定不可再对 ptr 指针做任何操作,包括 free();相反的,可以对 realloc() 函数的返回值进行正常操作。
- 如果是扩大内存操作会把 ptr指向的内存中的数据复制到新地址(新地址也可能会和原地址相同,但依旧不能对原指针进行任何操作);如果是缩小内存操作,原始据会被复制并截取新长度。
【返回值】分配成功返回新的内存地址,可能与 ptr 相同,也可能不同;失败则返回 NULL。
注 意 : 如 果 分 配 失 败 , p t r 指 向 的 内 存 不 会 被 释 放 , 它 的 内 容 也 不 会 改 变 , 依 然 可 以 正 常 使 用 。 \\colorred注意:如果分配失败,ptr 指向的内存不会被释放,它的内容也不会改变,依然可以正常使用。 注意:如果分配失败,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) 的长度。
以上是关于malloccallocrealloc的主要内容,如果未能解决你的问题,请参考以下文章