- 此问题在此处已有答案**:
C++ deprecated conversion from string constant to 'char*'(11个答案)
Deprecated conversion from string literal to 'char*' [duplicate](3个答案)
20天前关闭。
在我的代码中,我一直收到错误"从字符串常量到字符 * 的转换已被弃用"。代码的目的是使用指针到指针的方法为string1和string2分配一个单词,然后打印出来。我该如何修复这个错误?
下面是我的代码:
#include <iostream>
using namespace std;
struct WORDBLOCK
{
char* string1;
char* string2;
};
void f3()
{
WORDBLOCK word;
word.string1 = "Test1";
word.string2 = "Test2";
char *test1 = word.string1;
char *test2 = word.string2;
char** teststrings;
teststrings = &test1;
*teststrings = test2;
cout << "The first string is: "
<< teststrings
<< " and your second string is: "
<< *teststrings
<< endl;
}
2条答案
按热度按时间mgdq6dx11#
C++字符串常量是 const
char
的数组,这意味着你不能合法地修改它们。如果要安全地将字符串常量赋给指针(这涉及到数组到指针的隐式转换),则需要将目标指针声明为
const char*
,而不仅仅是char*
。下面是编译时没有警告的代码版本:
考虑一下如果语言 * 没有 * 施加这个限制会发生什么:
一个(non-
const
)char*
允许你修改指针指向的数据。如果你可以将一个字符串常量(隐式转换为指向字符串第一个字符的指针)赋给一个普通的char*
,你就可以使用那个指针修改字符串常量,编译器不会发出警告。上面的无效代码,*if it works *,将打印--在某些系统上可能确实如此,但在我的系统上,它因分段错误而死亡,因为它试图写入只读内存(不是物理ROM,而是被操作系统标记为只读的内存)。
(An旁白:C的字符串常量规则与C的规则不同。在C中,字符串常量是
char
的数组,* 而不是 *const char
的数组--但是试图修改它会有未定义的行为。这意味着在C中,你可以合法地写char *s = "hello"; s[0] = 'H';
,编译器也不一定会抱怨--但是当您运行程序时,程序很可能会因为分段错误而终止。这样做是为了保持与const
关键字引入之前编写的C代码的向后兼容性。C从一开始就有const
,所以这种特殊的妥协是不必要的。)bvuwiixz2#
基本上,字符串是在只读内存中创建的。如果你试图修改值,在C语言中,分段会在运行时出错。
为了克服运行时的这个问题,在C中提出了在编译时检查转换.
char * n =字符串;
在C中,字符串常量到char * 的隐式转换是不可能的,因为它在C++中是无效的。如果你试图转换,它会产生编译错误。
如果您想使用
常量字符 * n ="字符串";