使用gcc编译器和turbo C
编译时,以下程序给出了不同的结果#include<stdio.h>
#include<string.h>
void main()
{
char* c = "gatecs2017";
char* p = c;
printf( "%d", (int)strlen( c + 2[p] - 6[p] - 1 ) );
}
有人请解释一下该计划的运作情况。为什么它会产生不同的结果呢?
答案 0 :(得分:4)
strlen(c+2[p]-6[p]-1)
被翻译为strlen(((c + 't') - '2') - 1)
= strlen(((c + 116) - 50) - 1)
,因此,访问字符串边界之外(未定义的行为)。
答案 1 :(得分:0)
正如其他人清楚解释的那样,c + 2 [p] - 6 [p] - 1超过了数组范围。
确切地说,以及为什么不同的结果,这里还没有给出多余的解释:
c + 116是堆栈上的地址,c + 116字节的地址。然后调用strlen(地址),你就可以得到从你的堆栈中的c + 116开始的区域长度,直到&#39; \ 0&#39;。由于该区域未初始化或由不同编译器设置不同,因为当运行可执行文件的内核(假设内核运行它)将其加载到内存中时,它可能位于可执行文件中的某个位置,因此您将获得不同的结果每个编译器输出可执行文件。