已弃用从字符串常量到 'char*' 的转换

deprecated conversion from string constant to 'char*'

本文关键字:char 转换 字符串 常量      更新时间:2023-10-16

可能重复:
C++不赞成将字符串常量转换为';char*';

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

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

然而,我得到了这个错误:

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

我该怎么解决?

如果您真的想修改类型:

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

使用CCD_ 1的好处在于它能够处理所有这些问题。

这里发生了一些事情。

char *Type = new char[10];

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

Type = "Access";  // ERROR

这项作业并没有达到你认为的效果。它不会将6个字符的字符串"Access"(包括终止''在内的7个字符(复制到您刚刚创建的数组中。相反,它将指针分配给指针Type中该数组的第一个元素。这有两个问题。

首先,它破坏了Type的先前值。您刚才分配的10个字符的数组现在没有任何指向它的内容;您无法再访问它,甚至无法解除分配它。这是内存泄漏。

这不是编译器所抱怨的。

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

Type = "Access";
Type[0] = 'a'; // try to change the string to "access"

const的目的是防止您修改,甚至试图修改只读内容。这就是为什么不允许将非常量指针值分配给常量指针对象的原因。

既然您是用C++编程的,那么使用std::string可能会更好。

我想通过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);
}

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

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

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

当您想要更改C字符数组的内容时,不使用赋值运算符。这将改变基础指针的值。Ick。

相反,您应该使用C字符串库例程。例如,strcpy (Type, "Access");会将字符串文本"Access"复制到您的字符数组中,其中包含非常重要的尾部nul字符。

如果您使用C++(正如您的标记所示(,那么您可能应该使用std::string而不是char数组。作业按照你期望的方式进行。