有关内存的思考题

注意下面4个测试函数的运行结果:

测试函数1:

void GetMemory(char *p) 
{ 
p = (char *)malloc(100); 
} 
void Test(void)  
{ 
char *str = NULL; 
GetMemory(str);/* str拿不到GetMemory函数分配给p的空间(str = NULL;p = str;进入GetMemory函数后p = NULL;为p分配堆空间后str 仍为 NULL) */
strcpy(str, "hello world"); 
printf(str); 
}

运行结果:
程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的str一直都是NULL。
strcpy(str, "hello world");将使程序崩溃。

测试函数2:

char *GetMemory(void)
{	
char p[] = "hello world";/* 局部变量的生存周期为其所在函数的执行周期,函数调用结束后会被释放,定义为静态或全局变量后则不会被释放 */
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();	
printf("%s", str);
}

运行结果:
可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,

但其原现的内容已经被清除,新内容不可知。

测试函数3:

void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);/* 传入指针的地址才可获取GetMemory函数分配的空间(数据库中用的了此种方法),或者用return返回p,再用str接收 */
strcpy(str, "hello");	
/* 用完分配的内存中的数据后,记得释放内存 */
printf("%s", str);	
}

运行结果:

(1)能够输出hello(2)内存泄漏

测试函数4:

void Test(void)
{
    char *str = (char *) malloc(100);
	strcpy(str, “hello”);
	free(str);	    /* 用free释放后的内存,编译器不会把其中的数据清空(该内存没被再次使用前,仍可被使用),应手动清空:str = NULL; */
	if(str != NULL)
	{
	  strcpy(str, “world”);	
      printf("%s", str);
    }
}

运行结果:
篡改动态内存区的内容,后果难以预料,非常危险。
因为free(str);之后,str成为野指针,if(str != NULL)语句不起作用。

——以上内容摘自林锐《高质量C编程指南》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值