[解決済み] 警告: 文字列リテラルから 'char *' への変換は非推奨です。
質問
以下の(C++)コードについて。
char * type = "";
switch (mix_mode) {
case GO_HISTORY_VIDEO_MIX_VISUAL_GAS:
type = "visual gas";
break;
case GO_HISTORY_VIDEO_MIX_VISUAL:
type = "visual";
break;
case GO_HISTORY_VIDEO_MIX_GAS:
type = "gas";
break;
case GO_HISTORY_VIDEO_MIX_LARGE_IR_DIRECT:
type = "ir direct";
break;
case GO_HISTORY_VIDEO_MIX_LARGE_IR_FILTERED:
type = "ir filtered";
break;
}
strcpy(suffix, "avi");
snprintf(filename, sizeof(filename), "%s - (%s %s).%s", name_comp, type, uid, suffix);
以下のようなコンパイル時の警告が出るのですが。
GO_C_MSDExportManager.cpp:192:31: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
char * type = "";
^
GO_C_MSDExportManager.cpp:195:12: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
type = "visual gas";
^
GO_C_MSDExportManager.cpp:198:12: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
type = "visual";
^
GO_C_MSDExportManager.cpp:201:12: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
type = "gas";
^
GO_C_MSDExportManager.cpp:204:12: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
type = "ir direct";
^
GO_C_MSDExportManager.cpp:207:12: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
type = "ir filtered";
char ポインタが安全でないのはわかりますが、この文脈で何か悪いことが起こる可能性はないのでしょうか、一方で
type
は、他の場所では使われていません。
のようなことができることを知りました。
*type = 'X';
文字列リテラルを変更し、私のマシンをクラッシュさせる可能性があるため、それは悪いことです。
質問です。
charポインタの何が問題なのでしょうか?
は
const char * type = new char[20];
は、警告をなくすための良い修正方法でしょうか?
解決方法は?
文字列リテラル
の型は
const char[]
, と注意してください。
C言語では、文字列リテラルはchar[]型であり、(非const)char*に直接代入することができます。C++03でも同様に可能でした(ただし、C++ではリテラルがconstであるため、非推奨)。C++11では、このような代入をキャストなしで行うことはできなくなりました。
では
1.charポインタの何が問題なのでしょうか?
おっしゃるとおりです。
char *
は、文字列リテラルを変更することが可能であり、UBにつながります。
文字列リテラルから初期化された配列を作成し、後からその配列を変更するというような方法です。
char type[] = "something"; // type will contain a copy of the string literal
2.Is const char * type = new char[20]; a good fix to get rid of warnings?
ポインタの値を変更するだけで、ポインタの指す内容を変更するわけではないので、ここで新しい配列を作成する必要はありません。の型を変更するだけです。
type
を
const char*
,
const char * type = "";
関連
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み] std::string を const char* または char* に変換する方法
-
[解決済み] GCCで「文字列定数から'char*'`への非推奨の変換」という警告を消すにはどうしたらいいですか?
-
[解決済み] 文字列リテラルの前にある'b'文字は何を意味するのでしょうか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] C#のマルチライン文字列リテラル
-
[解決済み] Java文字列→日付変換
-
[解決済み】文字列の中にある文字列(実際はchar)の出現回数を数えるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】'std::cout'への未定義の参照