今天我们来学习一下动态内存函数,对内存进行准确的开辟和应用
提示:以下是本篇文章正文内容,下面案例可供参考
double * ptd;
ptd = (double * ) malloc (30 * sizeof(double));
在ANSIC中,为了程序清晰应对指针进行类型指派,但将void 指针值赋值给其他类型的指针并不构成类型冲突。
如果malloc()找不到所需的空间,它将返回空指针。
我们使用malloc()来创建一个 数组。可以在程序运行时使用malloc()请求一个存储块,另外还需要一个指针来存放该块在内存中的位置。
malloc可以申请0字节空间吗:
1. 调用多次 malloc(0) 函数,返回值并不会是同一个地址空间,在上述开发环境中,相差32位的地址;
2. 此地址所指向的内存空间上的值全是0;
在编译程序时,静态变量的数量是固定的:在程序运行时也不改变。
自动变量使用的内存数量在程序执行时自动增加或者减少。
但被分配的内存所使用内存数量只会增加,除非使用free()。
注意事项
常见用途
代码如下(示例):
int main()
{
int* p = (int*)malloc(10*sizeof(int));
if (p == NULL)
{
printf("%s\n", strerror(errno));
}
else
{
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
printf("%d ", *(p + i));
}
printf("\n");
int* p2 = (int*)realloc(p, 20 * sizeof(int));
if (p2 == NULL)
{
printf("%s\n", strerror(errno));
}
else
{
int i = 0;
for (i = 0; i < 20; i++)
{
*(p2 + i)=i;
printf("%d ", *(p2 + i));
}
}
free(p);
p = NULL;
return 0;
}
这个函数在创建时会将创建的空间里面的内容初始化为零(然而要注意,在某些硬件系统中,浮点值0不是用全部位为0来表示的)。
代码如下(示例):
long * newmen;
newmen = (long *) calloc (100, sizeof( long));
在这里,long使用4个字节,因此这一指令建立了100个4字节单元,总共使用400个字节来存储。
使用 sizeof(long)而不是 4 使代码更具可易移植性。
与 malloc()类似,calloc()在ANSI以前的版本中返回一个 char 指针,在ANSI中返回一个void指针。
演示:
int main(){
int *p=calloc(10,sizeof(int));
if(p==NULL){
printf("%s\n",strerror(errno));
}else{
int i=0;
for(i=0;i<10;i++){
printf("%d ",*(p+i));
}
}
free(p);
p=NULL;
return 0;
}
如果要存储不同类型,应该使用类型指派运算符。
这个新函数接受两个参数,都应是无符号的整数(在ANSI中是size_t类型)。
第一个参数是所需内存单元的数量,第二个参数是每个单元以字节计的大小。
它可在其他系统中运行,这些系统中 long不是4字节而是别的大小。
ok,关于动态内存函数的分享到这里就结束啦,有不足的地方欢迎大家指出,我会虚心接受的,另外有兴趣的可以在这个
cplusplus.com - The C++ Resources Network
上面寻找更多有用的东西