Why Doesn't Get Error Anymore | tech::interview
There is a code with a runtime error. We add printf to display the value of a variable and we don't get the runtime error anymore. explain what the reason can be.
这也是一道出现过多次的Google面试题。CareerCup上提供了一段很有意思的C语言代码,可以视为此问题的重现:
|
|
在大部分平台上,这段代码应该是正常执行的,但是注释掉printf,程序就会发生runtime error。
首先先回顾下memchr的作用:
|
|
这个C函数的功能是在ptr开始,长度为num字节的范围内找到第一个值为value的地址并返回。如果找不到,则返回NULL。
在上面的例子中,"Syshsh Pavlik"
这段长度不足16的常量字符串通常存储在程序的数据段中,假设它所在的内存的后面都是空的,那么这个memchr会返回NULL,也就意味着!*(int*)res
的执行必然会触发空指针访问。
但是如果在后面加一行printf,因为printf的第一个参数我们也传入了常量字符串,"Syshsh Pavlik\0"
的后面可能是"%p\n"
(当然这个是取决于运行环境和编译器的)。所以在我的平台上,加上printf后memchr返回的地址是指向"p\n"
的。
对于C/C++这类内存可以灵活掌控的语言来说,这个问题并不算特别罕见。比如错误的static_cast转换一个对象后,在调用这个指针的成员,是可能触发一些未知错误的。在加上printf后,改变了内存布局,有可能这个runtime error就不会触发了。
当然,对于其他很多语言,是有lazy loading/evaluation机制的。也就是一个变量直到被使用的时候才会被实例化。
Read full article from Why Doesn't Get Error Anymore | tech::interview