6年前あちらでは、トピ主に迷惑ですし、私も結論が知りたいので、別トピを立てました。したら、お互いに誤解があるのかも知れませんので、こちらで激論してください。私も、屍さんと同じように、文字列リテラルは書き換えてはいけないと思っておりました。一部のコンパイラ(たとえばBorlandC++)などでは、書き換えてしまいますが、これはコンパイラのバグだと思っていたわけです。私のパソコンはWindows7でVisualC++2008ExpressEditionです。書き込み中にアクセス違反が発生しました。エラーが実行時に出ます。Releaseでは、実行時にエラーは出ませんが、Hello!!のままで書き換えられません。私が理解している考えは"Hello!!"の部分は静的メモリエリアに用意され、マイコンの場合はROM領域だと思っております。先日、Arduinoを勉強していて、実行時にわざわざ、flashメモリからRAMにコピーをしていました。これは、Arduinoに使われているAVRマイコンが特別なのだと思っています。論点1規格で、文字列リテラルが書き換えられるかどうかは、未定義なのか。論点2VC++では、私は書き換えられなかったが、書き換えられたという人と、設定が違うのか。このままでは、気持ちが悪いので、はっきりさせてください。p46文字列リテラルは"静的記憶域期間を持ち...これらの配列をプログラムが変更しようとした場合、その動作は未定義とする"未定義なので、たとえ可能でも変更しないほうがいいと思いますym114さん。引用されたページは開けません。失礼しましたhttp://www.jisc.go.jp/app/JPS/JPSO0020.htmlX3010で開けるかと思いますこんな記事もありました。6年前おふたりとも情報ありがとうございます。未定義であることは間違いないですね。Windowsでは書き換えられるとは書いてありますが、VC++で書き換えられるとは書いてないですね。整理すると文字列定数を書き換えが可能かは未定義である。一部のコンパイラでは、書き換えが可能である。そこまでは、お互い理解している。主張A書き換えるコンパイラがあるのだから、文字列リテラルは変更できないというのは誤りである。主張B書き換えられないコンパイラがあるのだから、すべてのコンパイラでも動くように文字列リテラルは変更できないと覚えた方が良い。すれば...>書き換えるコンパイラがあるのだから、文字列リテラルは変更できないというのは誤りである。?動作を定義されてないんだから,書き換えるかもしれないしエラーで止まるかもしれないしそれ以外の何かが起こるかもしれない.なので「変更できない」「エラーになる」等と言い切ることは誤り.(「C言語」について話しているときに「私の環境では云々だからどうの」と言うことにまず意味が無い.)>書き換えられないコンパイラがあるのだから、すべてのコンパイラでも動くように文字列リテラルは変更できないと覚えた方が良い。6年前これまでの内容まとめ。ポインタ完全制覇」をお勧めします。読んだだけでもポインタの知識は身につきます。時間取れるのであれば書物での学習のほうが効率いいです。そのぶん、金かかります。'a';printf("\n%s",str);あとで聞かれてもいつ返事返せるか(返す気になるのか)わからないので、答えあらかじめいっておきます。ポインタ完全制覇」をお勧めします。読んだだけでもポインタの知識は身につきます。時間取れるのであれば書物での学習のほうが効率いいです。そのぶん、金かかります。'a';printf("\n%s",str);あとで聞かれてもいつ返事返せるか(返す気になるのか)わからないので、答えあらかじめいっておきます。リテラルとは関係ありませんから、文字列リテラルは変更できないというのは誤りです。実行時エラーになるはずです。少なくとも自分のgccではちゃんと強制終了になりました。あと、警告メッセージ見てみるとわかると思いますが、const付きなのでC++でconst_castしない限り変更できないはずです。変更できない理由としては、文字列リテラルは変数ではなく、定数ですから。main.cでコンパイルしてもエラーは出ませんし、実行したらhalloに書き換えられています。状況を限定するなら特定の状況ではと書くべきで、全部に通じるかのように書くのは危険だと思います。printf("\n%s",str);その通りですが、検証方法書かれていないただの屍のようださんの方が不明確な論証だと思います。ウィンドウズの処理系では文字列リテラルを書き換えられると既に書いているでしょう。未定義の動作についてきちんと調べてから書くようにしてはいかがですか?そもそも今回は未定義の動作に触れる必要ないですし。ふむふむ、これは突っ込むべきか、スルーすべきか、実に悩むところです。必要最低限だけ説明しよう。略で、配列をHello!!で初期化すると言う意味です。文字列リテラルの先頭アドレスをstrに代入するという意味です。*ちなみに、自分のPCはwindows7です。コンパイラはgccでもVC++2010でも実行時エラーで異常終了します。実行時エラーになるはずです。少なくとも自分のgccではちゃんと強制終了になりました。試すまでもない、ボーランドC++5.5なら警告すら出さずに通してくれます。エラーにもなりません。昔、この掲示板で言われたことをそのまま(正確に覚えてないが可能な限り原文に近い形で)言い返します。VC++だけ通るコードをいくら書いてもなんの価値もないです。「実際にどうなるのか」については置いといても,>ボーランドC++5.5なら警告すら出さずに通してくれます。エラーにもなりません。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。私の主張は、書き換えれる環境がある(あるいは可能性がある)なら、それは例題として不適格だと言うことです。言われて動いたら例題の意味が無いからです。私の環境と結果をまとめてみました。さんの結果と食い違いますね。ExpressとExpressなしでそこまで違うと思えませんが。問題が有ったので下に再検証。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。6年前あっごめんなさい。こっちのコードですね。これならnonさん方式ならエラーです。0;}私が思い込みでコードを見なおさずに混乱を広げた犯人の様です。【補足】言い訳になりますが、経験上そういう動作をすると知っていたのでソースコードの確認を怠りました。混乱させて申し訳なかったです。IDE上で/TCオプション時に実行時エラーになるのは知りませんでした。/TPだけだと思っていました。書き換えNG[/td][/tr][/table]やっぱり書き換えられる状況があります。nonさんと状況は一致しました。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。6年前メモリの属性がそれぞれの処理系で違うのでしょうね。リンクを修正しました。softya(ソフト屋)Write属性を使えば、定数データを置いたセクションを本当に書込み禁止にするかどうかを制御できますので、処理系によって差が出ているのでしょうね。6年前VC++の場合、ビルドオプションがメモリの配置に影響を与えていると思います。どのオプションかは検証していませんが、VisualStudio(IDE)上でDEBUGビルドしたものは、コマンドラインで実行すると異常終了します。配置というよりセッションセクションの構成ですね。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。>書き換えるコンパイラがあるのだから、文字列リテラルは変更できないというのは誤りである。?厳密にいえばそうでしょうね。'a';printf("\n%s",str);あとで聞かれてもいつ返事返せるか(返す気になるのか)わからないので、答えあらかじめいっておきます。文字列リテラルは変更できませんここで、環境も指定せず、断言されたことに対する反論だということですね。何かの本でも文字列リテラルは変更できませんと書かれていた本があったと記憶してます。(断言できないのですが)とすれば、初学者にたいし、説明足らずでそのように説明したとしても、そんなに的外れではないのかと。初学者の環境によっては動くかも知れないので混乱させるだろうという主張もよくわかります。最近、掲示板が荒れてきている印象があるので、相手の心情を慮ることも必要だなと考える次第です。ポインタで出来ること出来ないとがありますって所から説明に入れば問題が無いんですが、かなり唐突な例題だった思います。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。6年前>初学者にたいし、説明足らずでそのように説明したとしても、そんなに的外れではないのかと。ポインタで出来ること出来ないとがありますって所から説明に入れば問題が無いんですが、かなり唐突な例題だった思います。あのときのあの例題が適切だったのかと言われれば、それは私も同意します。>ほとんど回答になってない回答では質問者がかえって混乱するので、わかりやすく説明します。言われると・・・そうだよね。中途半端だったよねって思っていますが。指摘されると、そっちの説明はもっとわからんだろうと思ったのも事実でして。こっちの件(回答のやり方がへただった点)は、あんまり追求すべきではないと思います。気楽に回答できなくなってしまいますからね。#領域外参照とかも「やれる」のだから「できない」とは言えない.「(一般に)やるべきではない」→そのことを「(一般に,移植性のあるコードを書くなら?)してはならない」と説明することはまぁ悪くないと思う.これ、よくわかります。