我有以下代码
void func(char c[]) {
c[1]= '@';
std::cout<<c<<"\n"
<<sizeof(c)<<"\n";
}
// Main 1
int main() {
char temp[6] = "pinta";
func(temp);
}
如果我将主要功能更改为以下
//Main 2
int main()
{
func("pinta");
}
meow@vikkyhacks ~/Arena/c/LinkedList $ g++-4.8 scrap/test.cpp
scrap/test.cpp: In function ‘int main()’:
scrap/test.cpp:12:14: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
func("pinta");
^
经过一些谷歌搜索后,我了解到第二个main
没有传递任何字符数组而是传递read only string literal
,当命中c[1] = '@'
时会抛出一个seg错误。
我的问题是
“ 如何避免使用用于的temp
变量
Main 1
并直接将字符数组传递给func
它的参数? “
重要条件是允许编辑角色
数组传递到func
。
我看到有许多答案阻止我做c[1]= '@';
,这是我无法做到的,因为这条线对我来说非常重要。
答案 0 :(得分:7)
您无法避免创建临时文件,因为写入字符串文字的内存是非法的,但您可以让编译器为您创建它。以参数std::string
代替 - 这比char
数组更安全,并为您创建副本。
答案 1 :(得分:2)
这样做的一种方法是:
template<int N>
void func(char const (&c)[N])
{
// c[1] = '@'; you cannot assign to variable that is const
std::cout << c << "\n"
<< sizeof(c) << "\n";
}
int main()
{
func("pinta");
return 0;
}
但是请注意,您只将临时值绑定到const引用。
上面你实际上是对一个数组的引用传递,该数组的大小与你给出的字符串文字的长度+ 1(= \0
)一样大。
如果您需要func
内的可修改变量,那么您需要char
数组的副本:
template<int N>
void func(char const (&c)[N])
{
char cp[N];
copy(begin(c), end(c), cp);
auto len = distance(begin(cp), end(cp));
if (len > 1) cp[1] = '@';
std::cout << cp << "\n"
<< sizeof(cp) << "\n";
}
我还添加了一些范围检查(它是len
部分)