已弃用从字符串常量到 'char*' 的转换
deprecated conversion from string constant to 'char*'
可能重复:
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];
这创建了一个名为Type
的char*
指针,并将其初始化为指向新分配的10元素数组的第一个元素。
Type = "Access"; // ERROR
这项作业并没有达到你认为的效果。它不会将6个字符的字符串"Access"
(包括终止' '
在内的7个字符(复制到您刚刚创建的数组中。相反,它将指针分配给指针Type
中该数组的第一个元素。这有两个问题。
首先,它破坏了Type
的先前值。您刚才分配的10个字符的数组现在没有任何指向它的内容;您无法再访问它,甚至无法解除分配它。这是内存泄漏。
这不是编译器所抱怨的。
其次,字符串文字创建一个静态分配的const数组("静态分配"意味着它存在于程序的整个执行过程中(。Type
不是用const
限定符声明的。如果编译器允许您将std::string
0指向字符串"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数组。作业按照你期望的方式进行。
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 将函数参数"const char*"转换为"std::string_view"是
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- 如何在虚幻引擎4中将char*转换为TCHAR?
- C++:将模板类型 char 转换为 std::string
- strcmp/char* 转换无法按预期工作
- C++中的SQLite char*转换
- 无法从 const char* 转换为 const char *&
- 在 C++ 中将 char 转换为 int,而无需符号位传播
- 如果必须包含西里尔字符,如何将 char* 转换为 std::string?
- 试图使用strCMP时的char转换错误
- 无法从'const char *'转换为'LPCTSTR'
- 将 std::vector<char> 转换为字符* 会导致字符缺陷
- 使用 static_cast 将 char 转换为 int c++
- 如何在 C++(MFC) 中将 char* 转换为 LPCTSTR
- 无法将const char转换为字符串构造字符串