4

重複の可能性:
文字列への書き込み時にセグメンテーション違反が発生するのはなぜですか?

次のプログラムがあります。

#include <iostream>
using namespace std;

void reverseString(char* first, char* last)
{
    while(first < last)
    {
        cout << *first << " " << *last << endl; //for debugging; prints 'H' and 'o' then crashes
        char temp = *last;
        *last = *first; //this line crashes the program
        *first = temp;
        first++;
        last--;
    }
}

int main()
{
    char* s = "Hello";
    reverseString(s, s + strlen(s) - 1);
    cout << s << endl;
}

ただし、ポインターが指す値を交換するのに問題があります。*p = *p1 は、p のポイント先の値を p1 のポイント先の値に設定するだけでよいと考えましたが、何かがおかしいようです。助けてくれてありがとう!

4

3 に答える 3

7

コードは私にはうまく見えます。最も可能性の高い問題は、コンパイラが文字列リテラルが変更されていないと想定できるため、読み取り専用メモリに配置できることです。試す

char s[] = "Hello";

main()代わりに、文字列リテラルの書き込み可能なコピーを作成します

于 2012-12-08T05:46:27.830 に答える
1

@j_random_hacker の代替ソリューション:

char* buffer = new char[32];
strcpy(buffer, "Hello");
reverseString(buffer, buffer + strlen(buffer) - 1);

... rest of your program ...

delete[] buffer;

これにより、C スタイルの文字列に適切にメモリが割り当てられます。この文字列は、任意の関数で変更できます。もちろん、<string.h>にアクセスするにはヘッダーを含める必要がstrcpyありますstrlen

于 2012-12-08T06:06:08.713 に答える
0

strlen() のヘッダー ファイルがありません。

次に、警告がスローされます-文字列定数からchar *への非推奨の変換、@ j_random_hackerのソリューションがこの問題を処理しているようです。

于 2012-12-08T05:56:46.530 に答える