奇怪的使用strlen

时间:2011-06-08 08:22:37

标签: c++

我尝试编译以下示例代码:

#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;

int main ()
{
  if (strlen <= 0) {
    cout << "trace1" << endl;
    return 0;
  }
  cout << "trace2" << endl; 
  return 0;
}

奇怪的是它成功编译。你知道为什么吗?

我没有将strlen声明为变量。

4 个答案:

答案 0 :(得分:4)

仅使用函数的标识符衰减到相应类型的函数指针。在这种情况下,strlensize_t (*)(const char *)类型的指针。该指针保存可执行代码中函数的第一条指令的地址。

测试该指针的值是合法的,无论原因是什么,尽管在您提供的代码片段中它似乎很奇怪。

答案 1 :(得分:3)

没有()的strlen给你一个函数指针,指向在内存中分配strlen函数的地址。

如果库函数strlen的分配地址小于0,程序将打印“trace1”,这在世界上的每台计算机上都是不可能的,或者如果它在地址0处分配(极不可能但可能)。否则,如果strlen的分配地址大于零(很可能是这种情况),则会打印“trace2”。

答案 2 :(得分:2)

它可能衰变成一个衰变为整数的地址。一个真正的编译器可能会在屏幕上显示警告。

答案 3 :(得分:1)

如果对strlen以外的其他函数执行相同操作,此示例代码将打印trace2,因为strlen是指向函数size_t strlen ( const char * str )的指针,它的值应为正数。< / p>

cout << (size_t *) strlen << endl;
cout << (size_t *) strcat << endl;

例如上面的代码打印:

0x7fff84d29110
0x7fff84d63953

在我的机器上(因为你看到它们是正数,因为它们以7开头)。

此外,如果我在不转换为(size_t *)的情况下打印strlenstrcat,结果将为1,这意味着这些函数有效。