字符串函数strlen()的不同输出在C中

时间:2017-02-14 08:51:19

标签: c string

使用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 ) );
}

有人请解释一下该计划的运作情况。为什么它会产生不同的结果呢?

2 个答案:

答案 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;。由于该区域未初始化或由不同编译器设置不同,因为当运行可执行文件的内核(假设内核运行它)将其加载到内存中时,它可能位于可执行文件中的某个位置,因此您将获得不同的结果每个编译器输出可执行文件。