-4

重複の可能性:
Cでcharの文字列を変更することは可能ですか?

#include <stdio.h>

void reverseStr(char *str);

main()
{
  reverseStr("abcdef");
}

void reverseStr(char *str) {
    char *tmp = str;
    char curr;
    while (*tmp != '\0') {
        tmp++;
    }
    tmp--;
    while (tmp > str) {
        curr = *str;
        *str = *tmp;
        *tmp = curr;
        str++;
        tmp--;
    }    
}

実行すると、次のようになります。

/usr/bin/runit/srun_c: line 12:  2809 Segmentation fault      /tmp/run_c_executable

一体何が起こっているのですか?私は面接の練習をしています。Cで錆びていて、簡単なことを練習したかったのですが、私の人生ではこれを理解できません。行をコメントアウトするとセグメンテーション違反が消えることに気づきましたが、*str = *tmp;なぜそれがセグメンテーション違反を引き起こすのかわかりません。感謝します。

4

3 に答える 3

5

定数文字列を変更することはできません。代わりにchar配列を使用してください。

char str[] = "abcdef";

reverseStr(str);
于 2012-10-24T05:34:09.880 に答える
3

文字列リテラルは変更できません—読み取り専用メモリに保存されます。

使用する:

char str[] = "abcdef";

reverseStr(str);
于 2012-10-24T05:34:29.843 に答える
3

反転機能は正常に見えます。ただし、このクラッシュの原因となっているのは、関数を呼び出す方法です。関数に読み取り専用の文字列リテラルを渡しています。また、文字列リテラルの変更は未定義の動作であり、場合によってはクラッシュとして現れます。

変化する

reverseStr("abcdef");

char str[] = "abcdef";
reverseStr(str);

ここで、文字配列を関数に渡します。

于 2012-10-24T05:34:37.883 に答える