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

How to make sure function call proper with pointer

本文关键字:函数调用 确保 何使用 指针      更新时间:2023-10-16

当我这样调用时,以下代码将工作:

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;
     }
  }

}

char arr[] = "foobar";

chars的数组,包含以下字符:foobar。而

char* a = "foobar";

是错误的。"foobar"这里是一个字符串文字,这个语句必须是

 const char* a = "foobar"; // note the const

不能更改字符串文字。

这是一个常见的错误-区分指针和数组


不,没有办法阻止用户使用字符串文字调用reverse。"用户"对其行为负责。

如果a被定义为必须的(使用const(,编译器将告诉"用户"类似invalid conversion from ‘const char*’ to ‘char*’

p>不,无法保证传递给函数的指针是有效的。来电者提供有效数据是令人印象深刻的。你甚至可以做这样的
  int i = 0xABCD;
  reverse((char*) i);

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

使用std::string。在任何损坏之前,std::string是一个已知大小的连续内存块。

您甚至可以使用std::reverse

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