面试小记:关于数组和指针的一个笑话
2015-03-19 16:56
399 查看
面试题目:请问运行下面的程序会出现什么结果:
我乍一看,直接写下结果:hello,world
面试官问你确定没问题吗?我信心十足,没问题。他说:你错了,这个结果不对,让我再考虑一下。我又看了一遍,还是说没问题。后面我问他,他说这个程序应该运行起来会崩溃,因为getMemory返回的指针指向的内存为栈内存,会被释放掉。我争论说:没有吧,明明指向的是常量字符串,怎么可能会被释放掉呢?他很无赖,说让我回去试一下,后来我回去的路上想了很久,这明明是指向的常量字符串内存,后来再一回想,发现不对,a貌似是一个数组指针。哎,明白了,我错将a看成了普通指针。如果程序改成这样就没有问题了:
char a[] = "hello,world";
这一句会在栈上分配一个12个字节的数组空间(是12个吧,我没数错把,年纪大了伤不起),然后将常量字符串的内容拷贝过来,所以这与char *p = "hello,world"是有区别的,可以打印a的地址和p的地址,发现跟本就不一样,这么简单的问题,居然搞错了,愧对人类啊。记录一下,当笑话看吧。
char* getMemory() { char a[] = "hello,world"; return a; } int main(int argc, char **argv) { char *str = NULL; str = getMemory(); printf("%s\n", str); return 0; }
我乍一看,直接写下结果:hello,world
面试官问你确定没问题吗?我信心十足,没问题。他说:你错了,这个结果不对,让我再考虑一下。我又看了一遍,还是说没问题。后面我问他,他说这个程序应该运行起来会崩溃,因为getMemory返回的指针指向的内存为栈内存,会被释放掉。我争论说:没有吧,明明指向的是常量字符串,怎么可能会被释放掉呢?他很无赖,说让我回去试一下,后来我回去的路上想了很久,这明明是指向的常量字符串内存,后来再一回想,发现不对,a貌似是一个数组指针。哎,明白了,我错将a看成了普通指针。如果程序改成这样就没有问题了:
char* getMemory() { char *p = "hello,world"; return p; }都是眼神太快惹的祸啊,当时还暂金截铁的跟面试官争论,原来是我的错,尴尬啊。
char a[] = "hello,world";
这一句会在栈上分配一个12个字节的数组空间(是12个吧,我没数错把,年纪大了伤不起),然后将常量字符串的内容拷贝过来,所以这与char *p = "hello,world"是有区别的,可以打印a的地址和p的地址,发现跟本就不一样,这么简单的问题,居然搞错了,愧对人类啊。记录一下,当笑话看吧。
相关文章推荐
- C语言结构体里的成员数组和指针(C语言的一个隐晦角落——关于零数组)
- 关于 将一个数组赋值给另外一个数组会重置原来数组的指针 的问题
- 关于数组的a和&a的区别:一个是普通的指针,一个是数组的指针
- 关于结构指针类型数组做函数参数的一个问题#include<stdio.h>typede
- 数组不是指针——数组地址不能动态分配空间,一个小例子关于指针移动,以及malloc
- 关于一个C语言的笔试题(数组+指针)
- 关于数组与指针的一个小问题
- 一个关于指针数组的例子
- 关于数组与指针的一个面试题
- 关于面试常见的一个数组中找出出现一次的几个数字的问题
- CSDN论坛中一个关于数组指针的讨论帖
- 前两天困扰我的一个关于指针和内存的问题的总结
- C语言解惑上面一个数组指针题目分析
- 一个关于面试问题的博客网址
- C#学习小记5 一个有趣的程序关于复载property
- 一个关于类的数组成员变量问题
- 一个包含指针数组的排序和使用函数指针来控制排序方式
- 关于需求分析的一个笑话
- 一个不错的关于sql数组的使用例子
- 面试里经常遇到的一个关于StringBuffer和final的问题