teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

typoを修正

2015/05/12 01:25

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  1.このソース内の,どこで変換を実施しようとしているのか。
2
- 文字列リテラルは、これは正確な言い方ではないかもしれませんが、const *char型です。char*型に代入することが変換に該当します。
2
+ 文字列リテラルは、これは正確な言い方ではないかもしれませんが、const char*型です。char*型に代入することが変換に該当します。
3
3
 
4
4
  2.実行出来るようにはどのように変えればいいのか。
5
5
  const char*subname[]に変更して下さい。
@@ -10,7 +10,7 @@
10
10
  コンパイラに依存することなので、正確に回答しかねます。たぶんコンパイラオプションを弄ればいけるとは思いますが、推奨しません。
11
11
 
12
12
  解説
13
- 文字列リテラルは内容の書き換えが不可能な文字列です。つまり、文字列リテラルのポインタを扱う場合は const *char 型を使用する必要があります。
13
+ 文字列リテラルは内容の書き換えが不可能な文字列です。つまり、文字列リテラルのポインタを扱う場合は const char* 型を使用する必要があります。
14
14
  const修飾子がついていないために警告がでているのだと思います。
15
15
 
16
16
  これで意味がわからない場合、以下の違いについて考えてみてください。

3

追記

2015/05/12 01:25

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -17,6 +17,6 @@
17
17
 
18
18
  char[] = {"Math"} だと警告はでませんが、char* = "Math" だと同じ警告がでると思います。
19
19
 
20
- char[] = {"Math"} では長さ5のローカルの文字列変数に "Math" の値を詰め込んでいます。つまり、文字列リテラル(定数)の中身を一旦ローカル変数にコピーしています。
20
+ char[] = {"Math"} では長さ5のローカルの文字列変数に "Math" の値を詰め込んでいます。つまり、文字列リテラル(定数)の中身を一旦ローカル変数にコピーしています。この文字列が編集されても定数は変更されません。
21
21
 
22
- 一方、char*だとconst無しのポインタに定数"Math"のポインタを代入している形になります。定数はプログラムのリソース部分にあたります。定数自体を編集する(=この状態でchar*の参照先の文字列を編集する)場合の動作は未定義=禁止事項です。このため、const修飾子を着けて文字列リテラルを保護することが推奨されます。
22
+ 一方、char*だとconst無しのポインタに定数自体のポインタを代入している形になります。定数はプログラムのリソース部分にあたります。定数自体を編集する(=この状態でchar*の参照先の文字列を編集する)場合の動作は未定義=禁止事項です。このため、const修飾子を着けて文字列リテラルを保護することが推奨されます。

2

重複した表現の削除

2015/05/10 15:45

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -10,7 +10,7 @@
10
10
  コンパイラに依存することなので、正確に回答しかねます。たぶんコンパイラオプションを弄ればいけるとは思いますが、推奨しません。
11
11
 
12
12
  解説
13
- 文字列リテラルは内容の書き換えが変更不可能な文字列です。つまり、文字列リテラルのポインタを扱う場合は const *char 型を使用する必要があります。
13
+ 文字列リテラルは内容の書き換えが不可能な文字列です。つまり、文字列リテラルのポインタを扱う場合は const *char 型を使用する必要があります。
14
14
  const修飾子がついていないために警告がでているのだと思います。
15
15
 
16
16
  これで意味がわからない場合、以下の違いについて考えてみてください。

1

追記

2015/05/10 15:44

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -1,9 +1,10 @@
1
1
  1.このソース内の,どこで変換を実施しようとしているのか。
2
- 文字列リテラルは const *char型です。
2
+ 文字列リテラルは、これは正確な言い方ではないかもしれませんが、const *char型です。char*型に代入することが変換に該当します。
3
3
 
4
4
  2.実行出来るようにはどのように変えればいいのか。
5
5
  const char*subname[]に変更して下さい。
6
- より適切な方法としてはLPCTSTR等のマクロ利用があります、機会があれば調べてみてください(こちらは割愛します)
6
+ より適切な方法としてはLPCTSTR等のマクロ利用があります。
7
+ 機会があれば調べてみてください。(こちらは割愛します)
7
8
 
8
9
  3.非推奨ということは,無理矢理実行することも可能なのか。
9
10
  コンパイラに依存することなので、正確に回答しかねます。たぶんコンパイラオプションを弄ればいけるとは思いますが、推奨しません。