char * getPtr(void)
{
char str [10] ;
char *p;
p = str;
return p;
}
char * getMallocPtr(void)
{
char *p;
p = (char *)malloc(10 * sizeof(char));
return p;
}
上边2个函数那个能正确返回?
getPtr函数涉及2块内存,一块是分配给指针p的,在32位系统下分配4个字节存储地址(注:这个是系统分配的内存),系统为字符数组分配了一块内存,用来存储字符,这个也是系统自动分配的。
p = str 通过这条语句,让指针p指向str的代表的10个字节的内存。注意这2块内存都是系统分配的,按照c的规则,系统分配的内存在超出作用域的时候会自动释放。
函数结束返回指针P,函数返回指针p指向的内存释放,也就是P指向了一个无效的内存。所以错误。
getMallocPtr函数和上边不同的是p指向的内容是我们自己手动申请的,按照c的原则,手动申请的内存必须手动释放。所以p返回指向的是一个有效的内容。这个正确。
总结:不能返回一个指向程序自己申请内存的指针,也就是我们说的指向栈内存的指针。(手动申请的内存在堆中)