返回局部变量的指针很危险

#include "stdlib.h"  //应该为<stdlib.h>

char *test(char *ptr)
{
	unsigned char i;   //应该为unsigned int i;
	char buf[8*1024];  //局部变量太大了,容易造成堆栈溢出;
	char *p, *q;
	for( i=0; i <= 8*1024; i++ )  //应该为i < 8*1024;
		buf[i] = 0x0;

	p = malloc(1024);
	if (p == NULL ) return NULL;
	q = malloc(2048);
	if (q == NULL ) return NULL;  //应该为 q == NULL;
							 	  //应该先释放p,再返回; 
							 	  
	memcpy(p, ptr, 1024);  //Ptr是否为空未检查;
	memcpy(q, ptr 2048);   //应该为ptr+1024
	memcpy(buf, p, 1024);
	buf = buf + 1024;      //数组名不能赋值;
	memcpy(buf, q, 2048);

	free(p);
	free(q);

	return buf;  //返回局部变量指针非常危险; 
}

上面的代码,是摘自《嵌入式高级c语言》中的一个例子,来反映代码中常见的错误和潜在的危险因素。我想要重点指出的是最后一个:返回局部变量指针非常危险;

因为,局部变量是存在栈上的,当函数调用结束,该函数的栈帧就无效了,那么这个函数的栈空间随时都可能被用作其他的用途,所以返回这段内存的地址毫无意义。


需要说明的是,返回局部变量的值是可以的,这时return的值本质上是局部变量的拷贝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值