前段时间看了一个面试题,程序找错误:
char *str()
{
char p[] = "hello world!";
return p;
}
以前一直把数组名和指针看作一个东西,况且指针指向的是常量字符串,常量字符串保存在内存的静态数据区,函数结束不会释放的,错误认为,此程序没有错误,可以正确返回字符串。
在vc 6.0中编译运行时,输出的是乱码。
度娘了一把,现在把这个过程理顺清楚了,陈述如下:
常量字符串确实保存在内存的静态数据区,函数结束时不会释放。但是,此函数中的常量字符串赋值给了一个局部数组,函数结束时,数组释放,于是不能得到函数返回值。常量字符串一份保存在静态数据区,一份被拷贝到局部数组中。
引起我迷惑的地方主要在:字符数组名不能简单看作就是字符指针。
为了使此函数正常运行,可以做如下两种修改:
static char *str()
{
static char p[] = "hello world!";
return p;
}//静态数组保存在内存的静态数据区,函数结束不会释放
char *str()
{
char *p = "hello world!";
return p;
}//返回的是指针的值,也就是静态数据区中字符串的地址,函数结束不会释放