#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的值本质上是局部变量的拷贝。