近日,小编做到一套软件开发岗位笔试试题,是有关C/C++基础试题,其中有一部分是有关内存的思考题,让小编困惑了好久,现将题目列举如下:
1、
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行 Test 函数会有什么样的结果?
2、
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行 Test 函数会有什么样的结果?
3、
void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行 Test 函数会有什么样的结果?
4、
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行 Test 函数会有什么样的结果?
小编经过询问老师,上网搜集资料后终于将问题解决,现讲解如下:
第1题的运行结果如图所示:
这里str和p指向同一个地址,但是它们拥有各自的地址空间,GetMemory()函数虽然给p申请了空间,但并未给str申请空间,因此不能给str进行赋值操作,运行出错。
第2题的运行结果如下:
可以看到仅输出“hell”,紧跟着一个笑脸,输出错误。这是因为GetMemory()函数中的p数组是局部变量,数据存放在堆栈上,在函数返回之后p就被释放了,堆栈上相应的数据也就清空了。那么为什么输出“hell”+笑脸呢?个人认为这是跟环境有关,在函数返回时,堆栈并未清完,就将数组p的首地址给了str,可以说str临时保存了p的东西。当我把“hello world”换成其它的字符串,比如“abcdefg”时,可以看到只输出了笑脸。
另外,指针和数组是不一样的,当我把“p[]”换成“*p”时,“hello world”就可以被正常地打印出来了,这就证明给指针所指向地址赋值后,指针虽然被释放了,但该地址的内容并未清空。
第3题的运行结果如图所示:
这个程序正好解决了第一个问题,它将str指针所在地址传给了p,这样它们两个公用一个地址空间,所以对p申请空间,也就对str申请了空间,因此输出正确。
第4题的运行结果如下图:
str指针被free()函数释放掉时,str悬空,并不是NULL,因此条件成立,输出“world”。
以上都是小编个人总结,希望对大家有所帮助,如有什么问题,希望大家多提意见。