一,定义一个返回内存地址的函数
void getMemory(char *&p, int size){
p = (char *)malloc(size);
}
int main(){
char *str = NULL;
getMemory(str, 20);
if(str != NULL){
strcpy(str, "hello world");
}
cout<<str<<endl;
free(str);
str = NULL;
return 0;
}
定义上面的函数应注意下面几点问题
1,传指针引用,不能传指针,如果传递的是指针,那么对形参的修改不会影响到实参。
2,使用malloc()动态分配内存空间,应对返回的指针进行判断,判断是否为NULL。
3,动态分配的内存空间不使用时就应及时的释放掉,然后把指针设置为NULL。
二,封装malloc()函数
void* getMemory(int size){
return malloc(size);
}
int main(){
char *str = NULL;
str = (char *)getMemory(20);
if(str != NULL){
strcpy(str, "hello world");
}
cout<<str<<endl;
delete str;
str = NULL;
return 0;
}
要注意的问题与上面的问题一样
三,自定义返回内存的函数时,应注意的问题
1,返回一个数组名与返回一个指针的区别
(1)返回一个数组名
char *getMemory(){
char str[] = "hello world";
return str;
}
int main(){
char *str = NULL;
str = getMemory();
cout<<str;
return 0;
}
输出结果
`xG 玄i
Process returned 0 (0x0) execution time : 0.006 s
Press any key to continue.
程序分析
函数输出的是乱码,创建的数组是局部变量,用一个字符常量对它进行初始化操作。函数返回的是一个局部数组,因此,在函数返回后数组的内存空间就被释放掉,而此时str指向的是已经被释放掉的内存空间,因此会出现乱码。
(2)返回一个指针
char *getMemory(){
char *str = "hello world";
return str;
}
int main(){
char *str = NULL;
str = getMemory();
cout<<str;
return 0;
}
输出结果
hello world
Process returned 0 (0x0) execution time : 0.007 s
Press any key to continue.
程序分析
在getMemory()函数中定义了一个指针,指向一个字符串常量,字符串常量存储在字符常量区,在程序运行的过程中一直存在。
2,试图对字符串常量进行修改
char *getMemory(){
char *str = "hello world";
return str;
}
int main(){
char *str = NULL;
str = getMemory();
strcpy(str, "hello");
cout<<str;
return 0;
}
程序分析
上面的程序在运行的过程中会出现编译错误,使用strcpy试图对字符串常量进行修改。