什么是指针的正确无效值?

时间:2012-05-07 21:12:14

标签: c++ default-arguments

假设我有这段代码。你的基本“如果来电者没有提供价值,计算价值”的情景。

void fun(const char* ptr = NULL)
{
   if (ptr==NULL) {
      // calculate what ptr value should be
   }
   // now handle ptr normally
}

并用

调用它
fun();          // don't know the value yet, let fun work it out

fun(something); // use this value

然而,事实证明,ptr可以有各种值,包括NULL,所以我不能使用NULL作为调用者不提供ptr的信号。

所以我不确定现在给ptr提供什么默认值而不是NULL。我可以使用什么神奇的价值?有人有想法吗?

7 个答案:

答案 0 :(得分:4)

void fun()
{
   // calculate what ptr value should be
   const char* ptr = /*...*/;

   // now handle ptr normally
   fun(ptr);
}

答案 1 :(得分:2)

根据您的平台,指针可能是32位或64位值。

在这些情况下,请考虑使用:

0xFFFFFFFF or  0xFFFFFFFFFFFFFFFF

但我认为更大的问题是,“如何将NULL作为有效参数传递?”

我建议改为使用另一个参数:

void fun(bool isValidPtr, const char* ptr = NULL)

或者也许:

void fun( /*enum*/ ptrState, const char* ptr = NULL)

答案 2 :(得分:2)

我同意所提供的所有其他答案,但这里还有另外一种处理方法,如果更详细,我个人看起来更明确:

void fun()
{
  // Handle no pointer passed
}

void fun(const char* ptr)
{
  // Handle non-nullptr and nullptr separately
}

答案 3 :(得分:1)

你应该使用nullptr。它是C ++ 11标准的新功能。看看here进行一些解释。

答案 4 :(得分:1)

最好使用相同函数的重载版本进行不同的输入,但如果要使用单个函数,则可以将参数设为指针指针:

void fun(const char** ptr = NULL) 
{ 
   if (ptr==NULL) { 
      // calculate what ptr value should be 
   } 
   // now handle ptr normally 
} 

然后你可以这样称呼它:

fun();

char *ptr = ...; // can be NULL
fun(&ptr);

答案 5 :(得分:1)

如果你想要一个与没有用的参数相对应的特殊值,那就做一个。

头文件:

extern const char special_value;

void fun(const char* ptr=&special_value);

实现:

const char special_value;

void fun(const char* ptr)
{
    if (ptr == &special_value) ....
}

答案 6 :(得分:0)

1

我无法想象有人会用这个地址分配你的记忆。