这里没有软件测试的泛泛理论,只有博主的最佳实践。 博主的研究方向为静态分析和性能测试,致力于各种测试工具的引入、评估和开发。 本博的测试文章均为作者原创,转载请务必注明出处。

一个“中软”的关于内存的笔试题

上一篇 / 下一篇  2008-01-22 13:56:00 / 个人分类:静态分析

该题目是从http://bbs.51testing.com/viewthread.php?tid=78441&statsdata=67||104838发现的。我对中软的第三题关于“内存”的题目感兴趣,特拿来探讨。题目如下:

三.    有关内存的思考题
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 函数会有什么样的结果.

答案很简单,1 运行过程中会出现错误 2 会输出 乱码

题目看似不难,但程序员,尤其是初级的程序员在写代码时很容易犯的一个毛病。

C语言中,实参变量和形参变量之间的数据传递是单向的“值传递”方式,指针变量作函数参数也要遵循这一原则。调用函数不能改变实参指针变量的值(即指针的地址),但可以改变实参指针变量所指变量的值。

程序1就试图改变 str 的值,肯定不成功,getmemory执行完后,str还是NULL,所以在执行strcpy时,程序试图给NULL的指针赋值,会发生运行时错误。

程序2的问题在于 getmemory函数试图返回局部变量的地址。众所周知,局部变量的生命只存在于该函数体内,一旦离开该函数体,该局部变量便在内存中消失,所以str得到的只能是乱码。当然也不排除在某些特定的编译器上会输出“hello,world”字样。但严格的按照标准C来说,这种写法也是不被允许的。

 


TAG: 静态分析

 

评分:0

我来说两句

Open Toolbar