不推荐将字符串常量转换为'char *'

时间:2011-11-14 18:46:20

标签: c++ string char

  

可能重复:
  C++ deprecated conversion from string constant to 'char*'

我想通过char *将字符串传递给函数。

 char *Type = new char[10];
 Type = "Access";  // ERROR

但是我收到了这个错误:

 error: deprecated conversion from string constant to 'char*'

我该如何解决?

4 个答案:

答案 0 :(得分:38)

如果你真的想修改Type:

char *Type = new char[10];
strcpy( Type, "Access" );

如果您不想修改访问权限:

const char *Type = "Access";

请注意,但是,C和C ++中的char数组存在很多问题。例如,您实际上并不知道对new的调用是否成功,或者它是否会抛出异常。此外,strcpy()可能会超过10个字符的限制。

所以你可以考虑,如果你想稍后修改类型:

std::string Type = "Access";

如果您不想修改它:

const std::string Type = "Access";

...使用std::string的好处是它能够应对所有这些问题。

答案 1 :(得分:12)

这里有几件事情。

char *Type = new char[10];

这将创建一个名为char*的{​​{1}}指针,并将其初始化为指向新分配的10元素数组的第一个元素。

Type

此作业不符合您的想法。它不会将6个字符的字符串Type = "Access"; // ERROR (包括终止"Access"的7个字符)复制到刚刚创建的数组中。相反,它将指针分配给指针'\0'中该数组的第一个元素。这有两个问题。

首先,它破坏了Type的先前值。你刚刚分配的那个10个字符的数组没有任何指向它的东西;你不能再访问它甚至解除分配它。这是内存泄漏。

这不是编译器所抱怨的。

其次,字符串文字创建一个静态分配的const数组(“静态分配”意味着它存在于整个程序执行中)。 Type未使用Type限定符声明。如果编译器允许您将const指向字符串Type,则可以使用该指针(尝试)修改它:

"Access"

Type = "Access"; Type[0] = 'a'; // try to change the string to "access" 的目的是阻止您修改甚至尝试修改只读的内容。这就是为什么不允许将非const指针值分配给const指针对象。

由于您使用C ++进行编程,因此最好使用const

答案 2 :(得分:5)

  

我想通过char *将字符串传递给函数。

以下是如何通过char *将字符串传递给函数(请注意函数签名中所需的const关键字。)

#include <iostream>
void f(const char* p) {
  std::cout << p << "\n";
}

int main() {
  f("Access");
}

但是,如果您正在调用现有函数,并且无法修改其签名,该怎么办?

如果你有一些外部保证,该函数不会通过其参数指针写入

#include <iostream>
void f(char* p) {
  std::cout << p << "\n";
}

int main() {
  f(const_cast<char*>("Access"));
}

另一方面,如果函数可能写入字符串,那么您需要为字符串分配空间:

#include <iostream>
void f(char* p) {
  *++p;
  std::cout << p << "\n";
}

int main() {
  // Allocate read-write space on the heap
  char *p = new char[strlen("Access"+1)];
  // Copy string to allocated space
  strcpy(p, "Access");
  f(p);
  delete p;
}

或,

#include <iostream>
void f(char* p) {
  *++p;
  std::cout << p << "\n";
}

int main() {
  // Allocate read-write space on the stack
  char arr[] = "Access";
  f(arr);
}

但是,到目前为止最好的方法是避免整个指针mishegas:

#include <iostream>
void f(const std::string& p) {
  std::cout << p << "\n";
}

int main() {
  f("Access");
}

答案 3 :(得分:0)

这里有一个基本的操作问题,而不是编码问题。

如果要更改C char数组的内容,不使用赋值运算符。这将改变底层指针的值。 ICK。

相反,您应该使用C字符串库例程。例如,strcpy (Type, "Access");会将字符串文字“Access”复制到您的字符数组中,并使用其最重要的尾随空字符。

如果您正在使用C ++(如标记所示),您可能应该使用std::string而不是char数组。作业以他们期待的方式运作。