指针
1.what will happen after running the test?
#include <iostream>
void getMemery(char *p,int num){
p = (char *)malloc(sizeof(char)*num);
}
int main(){
char *str = NULL;
getMemery(str,100);
strcpy(str,"hello");
return 0;
}
答案:程序崩溃。实际上分配内存的只是形参p的一个副本,函数调用结束后p又没有返回给str,strcpy的str实际上是没有分配内存。
如果想不通过返回值的方式给str分配内存,程序如下。
#include <iostream>
void getMemery(char **p,int num){
*p = (char *)malloc(sizeof(char)*num);
}
int main(){
char *str = NULL;
getMemery(&str,100);
strcpy(str,"hello");
return 0;
}
2.这个函数有什么问题?该怎么修改?
char* fun(){
char str[] = "hello world";
return str;
}
答案:函数fun调用结束后,fun的栈帧被推出调用栈,str所在的内存块面临随时被其他程序使用的风险。
正确程序:
const char* fun(){
char *str = "hello world";
return str;
}
char str[] = "hello world";是个局部数组,分配在内存中的栈;
而char *str = "hello world";是个全局数组,分配在内存中全局区域,字符串常量保存在只读的数据段。
如果尝试修改字符串:
char *str = "hello world";
*str = 't';
运行报错。
而这样写:
char str[] = "hello world";
str[0] = 't';
就可以修改了。
如果想修改字符串,可以这样写:
const char* fun(){
static char str[] = "hello world";
return str;
}
通过static开辟一段静态存储空间。