一道经常出现的字符串内存地址问题的笔试题

原创 2013年12月03日 19:22:43

今年秋季的校园招聘已经接近尾声,笔试面试也参加了不少。发现有一道题经常出现,特拿来分享。

问题1:

void getmemory(char *p)
{
    p = (char *)mallol(100);
}
void test(void)
{
    char *str = NULL;
    getmemory(str);
    strcpy(str,”hello,world”);
    printf(str);
}

请问运行Test函数会有什么样的结果?

问题2:

 char*getmemory(void)
{
    char p[] = ”helloworld”;
    return p;
}

void test(void)
{
    char *str = NULL;
    str=Getmemory();
    printf(str);
} 
请问运行Test函数会有什么样的结果?

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


如果还有疑惑,gcc编译及运行结果将消除你的疑虑。

第一段代码在Ubunu下的运行结果:

看吧!明显的内存错误!

再看第2段代码:

gcc的编译警告大概已经很能说明问题了!


想必C语言高手会觉得这些问题很low level,可是不幸的是想我这样C语言不扎实的人经常会犯这样的错误!

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

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

2的问题在于getmemory函数试图返回局部变量的地址。众所周知,局部变量的生命只存在于该函数体内,一旦离开该函数体,该局部变量便在内存中消失,所以str 得到的只能是乱码。


因此,说到底,还是要牢记千万不能返回局部变量的地址,还有小心有指针情况的“传值”!


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

IT笔试题中经常出现的前缀、中缀、后缀表达式转换问题-----阿冬专栏

转载自:http://blog.csdn.net/antineutrino/article/details/6763722 做笔试题学习遇到,收集的最好的解释,通俗易懂。 它们都是对表达式的记法,...

【C#】显示引用类型变量的内存地址(以字符串为例)

对于C/OC/C++程序员来说,输出一下所创建对象的内存地址,观察、分析或者单纯处于好奇心,都是很平常的事情。 然而对于将安全放在第一位的C#语言来说,这个“平常事”貌似并不那么直接。 本文对C#语言...

Object.toString()返回字符串的意义:对象名+@+对象内存地址?

在Java中,如果一个对象未重写toString()方法,那么它将会调用父类的toString(),如果父类也没有重写这个方法,那么就迭代往上调用,直到Object的toString()方法。 ps...

C++类的内存地址存放问题

参考网址:http://hi.baidu.com/lovestartian/item/5e10f99e1b1faedb1e4271a3 了解C++类地址的存放和分配等问题,能帮助我们...

C/C++中的内存地址分配问题

参考网上他人写的博客,感觉不是很符合,内存的从到到底的分配顺序不符,或许是每个编译器都不十分一样,我也无法做出合理解释,但是作者所讲的各个内存区的分配是完全吻合的,本人再最后的程序作了修改,已验证我的...

Dalvik切换到ART时内存地址对齐问题的分析(1)

AVD启动时打印详细日志信息需要取消 art/runtime/runtime.cc 文件中的374至384行(gLogVerbosity...)的注释。 在之前追踪的函数调用过程中,在文件 art/...

内存地址对齐问题研究所分析

1.指针对齐问题          CPU一般要求指针的值(内存地址)要与它的指向类型数据的尺寸相匹配。例如,2个字节的数据类型被访问的地址值为 2 的倍数,4个字节的数据类型(如 int)被...

C++类的内存地址存放问题

C++类的内存地址存放问题(动态更新中) 了解C++类地址的存放和分配等问题,能帮助我们更深入、更清晰了解类的组成及其使用。 自己目前不是很清楚,先收集一些网上资料,而后再慢慢补充...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)