如何使用指针确保函数调用正确

时间:2013-04-13 15:35:44

标签: c++ pointers

当我这样打电话时,下面的代码将起作用:

char arr[] = "foobar";
reverse(arr);

但是当我这样打电话时它不起作用,因为它指的是只读部分

 char*a = "foobar";
 reverse(a);

现在我的问题是,有什么方法可以避免用户像这样打电话吗?

void reverse(char *str)
{
  char * end = str;
  char tmp;
  if (str) 
  { 
     while (*end)
     {      
       ++end;
     }
     --end;
     while (str < end)
     {
        tmp = *str;
        *str++ = *end;
        *end-- = tmp;
     }
  }

}

3 个答案:

答案 0 :(得分:2)

char arr[] = "foobar";

char个数组,包含以下字符:fooba,{{1 },r。而

\0

错了。 char* a = "foobar"; 这里是一个字符串文字,此语句必须是

"foobar"

您无法更改字符串文字。

这是一个常见的错误 - 在指针和数组之间产生差异。


不,没有办法阻止用户使用字符串文字调用 const char* a = "foobar"; // note the const 。 “用户”负责他们的行为。

如果reverse被定义为必须(使用a),编译器会告诉“用户”类似const

的内容

答案 1 :(得分:0)

不,无法保证传递给函数的指针有效。呼叫者提供有效数据是不可能的。你甚至可以做这样的事情

  int i = 0xABCD;
  reverse((char*) i);

这没有什么意义,但没有办法反过来检查这些事情。

答案 2 :(得分:0)

使用std::string。在发现任何损坏的情况下,std::string是一个已知大小的连续内存块。

您甚至可以使用std::reverse

除了正确的设置外,编译器还会阻止您将字符串文字分配给char*变量。