可能重复:
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*'
我该如何解决?
答案 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数组。作业以他们期待的方式运作。