/**********************************8
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int i;
int *pn=(int *)calloc(10,sizeof(int));
//calloc 的作用是分配并初始化内存块 , 返回一个指向 nmemb 块数组的指针 , 每块大小为 siz e
//个字节。它和 malloc 的主要不同之处是会初始化(清零)分配到的内存。
for(i=0;i<9;i++)
printf("%3d",*pn++);
printf("\n");
free(pn);
return 0;
}
*************************************/
//不知为什一直么有问题
//输出十个0。
/*
#include <stdlib.h>
#include<string.h>
#include <stdio.h>
int main(void)
{
char *str = NULL;
// 分配内存空间
str = (char*)calloc(10, sizeof(char));
// 将hello写入
strcpy(str, "Hello");
//显示变量内容
printf("String is %s\n", str);
// 释放空间
free(str);
system("pause");
return 0;
}*/
/**********************************
calloc是一个C语言函数
函数名: calloc
void *calloc(unsigned n,unsigned size);
功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
跟malloc的区别:
calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。
用 法: void *calloc(unsigned n,unsigned size);
头文件:stdlib.h或malloc.h
相关函数:malloc、realloc、free
*********************************/
/****************************************
void * realloc( void *ptr, size_t size );
realloc 以 ptr 所指地址为首址,分配 size 个字节的内存,并返回 ptr 所指地址。 realloc 不会
初始化分配到的内存块,如果 ptr 为 NULL 则相当于 malloc ,如果 size 为 NULL 则相当 于
free(ptr) 。不能分配返回 NULL 。
******************************************************/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void main( void )
{
long *buffer;
size_t size;
if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )
exit( 1 );
size = _msize( buffer );
printf( "Size of block after malloc of 1000 longs: %u\n", size );
/* Reallocate and show new size: */
if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))
== NULL )
exit( 1 );//exit(1)表示异常退出.这个1是返回给操作系统的不过在DOS好像不需要这个返回值
size = _msize( buffer );
printf( "Size of block after realloc of 1000 more longs: %u\n",
size );
free ( buffer );
system("pause");
exit( 0 );//exit(0)是结束程序! return(0) 结束程序,并且给某一函数一个返回值!exit(0)表示正常退出
}
/**********************************************
alloca 、 calloc 、 malloc 、 realloc 负责分配内存, free 负责释放
内存。其中 alloca 是在栈中分配内存,而 calloc 、 malloc 、 realloc 是在堆中分配内存,也就
是说 alloca 的内存分配,是有作用域的,不需要释放,而 calloc 、 malloc 、 realloc 内存是没
有作用域的,需要调用 free 主动释放分配内存区域。 alloca , malloc , realloc 只负责分配内
存 , 并不初始化分配内存空间 , 而 calloc 不仅分配内存 , 还负责初始化分配内存为 0 。 reallo c
是以传入指针为基址,分配指定大小的内存区域。
************************************************
c语言内存常见错误
1 、 内存分配后没有校验,使得内存未成功,却正常使用。
2 、 内存分配成功后,没有初始化就使用。
3 、 内存分配成功 , 也进行了初始化 , 可是使用内存时出现了越界 ( 缓冲区溢出 ) 。 这种错
误如果被黑客成功利用,最严重的后果就是整个操作系统被黑客完全控制。
4 、 内存分配成功后,忘记释放内存,产生内存泄漏。
5 、 内存分配成功后,也正常释放内存,可是在释放内存后又继续使用。
6 、 混淆指针和数组。
1 ” 操作。
释放后继续使用内存指针的问题也是一个非常严重的问题,如果加上逻辑复杂,测试不能
遍历所有路径的话,极有可能成为一个小 BUG 。那么出现这种问题有哪些情况呢?
1 、 程序逻辑异常复杂,释放之后并没有将所有指向这块内存区域的指针清 0 。
2 、 在函数中返回了栈内存的指针或引用。
3 、 使用 free 或 delete 释放了内存后,没有将指针设置为 NULL ,导致产生 “ 野指针 ” 。
还有就是存在多个这向该内存的指针,释放时没有将所有指向该内存地址的指针设置
为 NULL 。
函数种返回了栈内存地址或引用这个例子比较容易理解。如下:
char * GetTemp()
{
char szTemp[]= ” hello ” ;
return szTemp;
}
在上面的例子中 , 由于 szTemp 属于栈内分配内存 , 在函数执行完成后 , 将自动释放 szTem p
分配的栈内存 , 所以调用 GetTemp 函数取得的指针指向内存地址是一个无效地址 , 该内存
中存储内容是不可预见的。
//
大部分内容都是c语言内存管理上的,大开眼界
c语言深入理解<4>
最新推荐文章于 2022-09-10 15:56:33 发布