我们来看下图
运算的结果会是什么呢?
接下来开始我们的分析。
****在1中
arr被单独放在strlen函数中,表示数组的首元素地址。
由于数组中没有\0,因此strlen在计算arr长度的时候并不会出现正常结果,
但是也不至于造成死循环。
因为在arr后的空间中往往会存在0等元素存放在地址中,
这里内存的0就相当于\0,会使strlen函数停下来。但我们并不知道\0与数组arr之间的“距离”,
所以第一题的结果会是一个随机值
****在2中
arr+0表示首元素的地址,在用法上与arr是一样的,
而且由于指向的都是首元素的地址,
所以连输出结果的随机值也是相等的
***在3中
arr表示首元素地址,arr则表示第一个元素,即a。当a传入strlen时,
编译器识别时只认识其ASCII值,我们知道a的ASCII值为97,
这样97就被当做地址传入函数strlen中了。
在strlen的视角中,这97妥妥的是个非法地址,
因此就会报错。
如下图所示
****在4中
arr[1]表示第二个元素,即b,b的ASCII值为98
,传入函数strlen中后也是个非法地址,
同样会报错
****在5中
由于arr与&结合,这里的arr表示整个数组,&arr表示整个数组的地址。
strlen会从第一个元素开始数,知道遇到\0为止。
当然这里的结果也是随机值,
而已与1中的随机值是等大的
****在6中,
&arr+1表示跳过了一个数组大小后到达的位置,
即下图所示
当然我们也同样不知道\0的位置,因此这题的结果也同样是随机值。
但是如果在细节考究一点,我们知道6的答案是从&arr+1的位置开始数的。
arr数组的类型为char ,且元素个数为6,因此数组大小为6。
由此我们能知道这个随机值恰好等于1的随机值减去6个字节。
****在7中
&arr[0]表示首元素的地址,+1则表示跳过一个元素大小,arr中的数组类型为char,
因此跳过了一个char类型的大小,则跳到了arr[1]的地址。
无法得知\0的位置,这一题同样也是随机值,
而根据上一题的做法我们可以得知这一题的随机值等于1的随机值减去1
****最后,让我们剔除掉3和4这两个报错的再运行试试
可以看到这个除了3和4之外的都是可以运行的,
而这里运算出的随机值是42,说明从首元素开始经历了42个元素大小才找到\0。
而且第6题的答案为36,恰好是我们分析的42-6
第7题的答案是41,恰好是41-1
这说明我们的分析应该没有什么问题