当我这样打电话时,下面的代码将起作用:
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;
}
}
}
答案 0 :(得分:2)
char arr[] = "foobar";
是char
个数组,包含以下字符:f
,o
,o
,b
,a
,{{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*
变量。