题目1:下面函数中,调用test函数的返回值(腾讯笔试题)
char* getMem(void) {
char p[] = “hello world ”;
p[5] = 0x0;
return p;
}
void test(void) {
char *s = 0x0;
s = getMem();
printf(s);
}
A. hello B.无输出 C.hello0world D.不确定
答案:D
解析:在getMen函数中,数组p是一个局部变量,存储在系统内存的栈(stack)区。在getMem函数调用结束时候,系统会自动销毁数组p。函数getMem返回的是char *类型,赋值给char *类型的变量s,但是由于在getMem函数调用结束时候,系统会自动销毁数组p中的内容,所以,虽然s指向的是p的地址,但是p中的值被销毁,所以s输出为随机值。
程序运行结果:
题目2:下面函数中,调用test函数的返回值(腾讯笔试题)
#include < stdio.h >
char* getMem(void) {
char *p="hello world";
return p;
}
void test(void) {
char *s = 0x0;
s = getMem();
printf(s);
}
题目2与题目1不同的是,p由数组变为了指针。由于指针所指向的内容”hello world“放在文字常量区,在函数调用结束的时候不会被销毁,所以程序正确的运行结果是,输出hello world。
<img src="https://img-blog.csdn.net/20150902183815649?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />