私はこのプログラムをどこかから手に入れ、理解しようとしています。s [j] = s [i];文字をコピーしようとしているときにセグメンテーションエラーが発生しました
この行:s[j++] = s[i];
がクラッシュの原因です。私の理解は、jが後で増分されるため、少なくともプログラムがクラッシュしないようにすることです。最初のjとiの値は0になります。
したがって、これはs [0] = s [0]のようになります。
なぜこのクラッシュが発生するのですか?
#include <iostream>
using namespace std;
void squeeze(char a[], char c);
int main()
{
squeeze("qwiert", 'i');
return 0;
}
void squeeze(char s[], char c)
{
int i, j;
for (i = j = 0; s[i] != '\0'; i++)
{
if (s[i] != c)
{
std::cout << "\ni: " << s[i];
s[j++] = s[i];
std::cout << "\nj: " << s[j];
std::cout << "\nj : " << j;
exit(0);
}
}
s[j] = '\0';
}
出力:このプログラムがクラッシュした後
i: q
。
私はsegfaultを見つけるためのプログラムを停止するexitステートメントを置いています。
あなたがなどのように、文字列に リテラルを変更することが許可されていない
がsのために予約アドレス空間は、書き込み保護されていませんか? main()では定数のように定義されているため、コンパイラはそれを特殊なメモリ領域に入れることができます。しかしそれはちょうど推測です。 – KillPinguin
ええ、それが理由でした。 @KillPinguin –
コンパイルすると、次のような警告が表示されます。「ISO C++では、文字列定数を 'char *' [-Wwrite-strings]に変換することが禁止されています。いくつかのコンパイラはこれを完全に拒否し(技術的にはすべて)、エラーを出します。プログラムは警告とともにコンパイルされますが、警告はかなり正当なものではないことを意味し、プログラムは期待どおりに動作しない可能性があります。 – user4581301