c++ 不推荐使用从字符串文字到char* 的转换[重复]

niknxzdl  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(192)
    • 此问题在此处已有答案**:

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;  
}
mgdq6dx1

mgdq6dx11#

C++字符串常量是 constchar的数组,这意味着你不能合法地修改它们。
如果要安全地将字符串常量赋给指针(这涉及到数组到指针的隐式转换),则需要将目标指针声明为const char*,而不仅仅是char*
下面是编译时没有警告的代码版本:

#include <iostream>

using namespace std;

struct WORDBLOCK
{
    const char* string1;
    const char* string2;
};

void f3()
{
    WORDBLOCK word;

    word.string1 = "Test1";
    word.string2 = "Test2";

    const char *test1 = word.string1;
    const char *test2 = word.string2;

    const char** teststrings;

    teststrings = &test1;
    *teststrings = test2;

    cout << "The first string is: "
         << teststrings
         << " and your second string is: "
         << *teststrings
         << endl;
}

考虑一下如果语言 * 没有 * 施加这个限制会发生什么:

#include <iostream>
int main() {
    char *ptr = "some literal";  // This is invalid
    *ptr = 'S';
    std::cout << ptr << "\n";
}

一个(non-constchar*允许你修改指针指向的数据。如果你可以将一个字符串常量(隐式转换为指向字符串第一个字符的指针)赋给一个普通的char*,你就可以使用那个指针修改字符串常量,编译器不会发出警告。上面的无效代码,*if it works *,将打印

Some literal

--在某些系统上可能确实如此,但在我的系统上,它因分段错误而死亡,因为它试图写入只读内存(不是物理ROM,而是被操作系统标记为只读的内存)。
(An旁白:C的字符串常量规则与C的规则不同。在C中,字符串常量是char的数组,* 而不是 * const char的数组--但是试图修改它会有未定义的行为。这意味着在C中,你可以合法地写char *s = "hello"; s[0] = 'H';,编译器也不一定会抱怨--但是当您运行程序时,程序很可能会因为分段错误而终止。这样做是为了保持与const关键字引入之前编写的C代码的向后兼容性。C从一开始就有const,所以这种特殊的妥协是不必要的。)

bvuwiixz

bvuwiixz2#

基本上,字符串是在只读内存中创建的。如果你试图修改值,在C语言中,分段会在运行时出错。
为了克服运行时的这个问题,在C中提出了在编译时检查转换.
char * n =字符串;
在C
中,字符串常量到char * 的隐式转换是不可能的,因为它在C++中是无效的。如果你试图转换,它会产生编译错误。
如果您想使用
常量字符 * n ="字符串";

相关问题