本人在指针犯过的错误
错误一 取函数返回值地址
正确的一
int ret_int(){
int a = 3;
return a;
}
int main(){
int value = ret_int(); // 创建一个变量保存临时值
int *p = &value; //获取变量地址
return 0;
}
正确的二
int ret_int(){
int a = 3;
return a;
}
int main(){
int *p = new int;
*p = ret_int();
...
delete(p);
return 0;
}
错误二 在局部作用域内取变量地址
错误三 函数返回本地变量地址
int *ret_int_point(){
int a = 3;//错误,变量a在函数结束后被释放
return &a;
}
int main(){
int *p = ret_int_point();
return 0;
}
正确的办法:使用动态内存分配变量空间,并手动释放空间
#include <stdlib.h>
int *ret_int_point(){
int *a = (int*)malloc(sizeof(int));
return a;
}
int main(){
int *p = ret_int_point();
...
free(p);
return 0;
}
错误四 修改形参指针地址
void MemAllocate(char *arg){
arg = (char *)malloc(sizeof(char));
}
int main(){
char *p = NULL;
MemAllocate(p);
*p = 'x';//此处崩溃
return 0;
}
函数分配内存并不能成功。分配空间时,所改变的是形参指针指向的地址空间,而并不能改变实参指针的内容,如果想改变实参,需要使用二级指针。
正确的写法应该是
void MemAllocate(char **arg){
*arg = (char *)malloc(sizeof(char));//arg指向实参地址,达到修改实参的目的
}
int main(){
char *p;
MemAllocate(&p);
*p = 'x';
return 0;
}
归根结底,函数只能修改形参,只不过使用指针达到修改实参的目的。
错误五 返回局部变量储存的字符串
这个函数返回的是指向栈上局部变量的指针,这在函数返回后栈空间释放,将会导致未定义的行为,正确的办法是使用动态分配内存
char* get_info(){
char* info= new char[4];
strcpy(info, "abv");
return info;
}
...
char* str = get_info();
cout << str << endl;
//手动释放
delete[] str;
或者将结果返回给参数