このコードには少なくとも3つの問題があります(おそらくそれ以上です。私はC ++の専門家ではありません)。
最初の問題は、OSがディスク上のexeファイルに直接マップするプログラムメモリの読み取り専用部分に配置できるため、のような文字列定数を変更しないことです(OSは同じの複数の実行中のインスタンス間でそれらを共有する可能性があります)たとえば、プログラムを実行するか、RAMが少ないときにスワップファイルに書き込む必要のあるメモリの部分を避けてください。これは、exeから元のファイルを取得できることがわかっているためです)。たとえば、この例は私のコンパイラでクラッシュします。文字列を変更するには、 strdupなどを使用して、文字列の変更可能な複製を割り当てる必要があります。
2番目の問題は、それを宣言せずに名前空間を使用していることですcout
。アクセスの前に宣言を付けるか、宣言を追加する必要があります。endl
std
std::
using namespace std;
3番目の問題は、2行目の操作が発生する順序が未定義の動作であり、1行目の終わりに表示されてから次の行cout
に表示されるまでの間に文字列が明らかに不思議に変化することです。cout
このコードは特に何もすることを意図していないため、修正できるさまざまな有効な方法があります。これはおそらく実行されます:
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
int main()
{
char *string = strdup("School");
char *p = string;
char c;
c=++(*(p++));
cout<<c<<","<<p<<endl;
cout<<p<<","<<++(*(p--))<<","<<++(*(p++))<<endl;
free(string);
}
(私のコンパイラでは、これは次のように出力します:T,chool
、diool,i,d
。)
ただし、まだ未定義の動作があります。これを修正するには、2cout
行目を次のように作り直します。
cout << p << ",";
cout << ++(*(p--)) << ",";
cout << ++(*(p++)) << endl;
T,chool
これにより、が得られるはずですchool,d,U
(AからZまでの文字セットを順番に持つと仮定します)。