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

原创 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 得到的只能是乱码。


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


面试题(一)-------面试中常见的字符串类型题目及思路解答

1.左旋转字符串 2.替换空格 题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出"We%20are%20happy"。 思路扩展题目:有两...
  • Huang_oracle
  • Huang_oracle
  • 2014年02月17日 17:58
  • 1879

笔试题—字符串常见的算法题集锦

笔试题—字符串常见的算法题集锦本篇博客主要讲解一下四个问题 KMP算法 字母倒序输出 全排列 全组合 KMP算法关于KMP算法的分析,这里就不讲解了,有兴趣的可以参考这篇博客:从头到尾彻底理解KMP代...
  • gdutxiaoxu
  • gdutxiaoxu
  • 2016年09月21日 00:01
  • 3244

Java 经典算法面试题集锦

1.随机产生20个不能重复的字符并排序 package com.test.kaoshi; import java.util.HashSet; import java.util.Iterator; ...
  • wenbitianxiafeng
  • wenbitianxiafeng
  • 2014年03月26日 09:37
  • 1655

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

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

TD安装及使用过程中经常出现的问题及解决方法.doc

  • 2012年12月13日 18:30
  • 48KB
  • 下载

Linux下经常出现的小问题

  • 2013年03月22日 21:47
  • 26KB
  • 下载

Java经典算法题目面试题经常出现的

1、Fibonacci-费式数列问题说明: Fibonacci为1200年代的欧洲数学家,在他的著作中曾经提到:若有一只兔子每个月生一只小兔子,一个月后小兔子也开始生产。起初只有一只兔子,一个月后就有...
  • xiaoyu714543065
  • xiaoyu714543065
  • 2013年01月06日 11:24
  • 849

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

在Java中,如果一个对象未重写toString()方法,那么它将会调用父类的toString(),如果父类也没有重写这个方法,那么就迭代往上调用,直到Object的toString()方法。 ps...
  • cjf1002361126
  • cjf1002361126
  • 2016年10月07日 16:19
  • 909

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

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

典型的Top K算法 _找出一个数组里面前K个最大数_找出1亿个浮点数中最大的10000个_一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存.

Top K 算法详解 应用场景:         搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。         假设目前有一千万个记录(这些查询...
  • u010355144
  • u010355144
  • 2015年04月10日 22:10
  • 1204
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一道经常出现的字符串内存地址问题的笔试题
举报原因:
原因补充:

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