c语言深入理解<4>

/**********************************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语言内存管理上的,大开眼界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值