4

2文字をポインタで入れ替える必要がありますが、このコードを実行するとプログラムがクラッシュします。

int main(){
    char *s1 = "string1";
    swap(st,(st+1));

    /* BUT THIS CODE WORKS - Whats the problem?
     * char s1[] = "string1";
     * swap(s1,&s1[1]);
     */

    return 0;
}

void swap(char * const ptr1, char * const ptr2){

    char temp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = temp;

}
4

3 に答える 3

5
char *s1 = "string1";

s1文字列リテラルを指し、変更するとCで未定義の動作が呼び出されるためです。これが機能しない理由です。

これに対して char s1[] = "string1";

s1は配列であるため、変更できます。

于 2013-01-27T11:42:06.827 に答える
2

文字列リテラルは変更できません。"string1"許可されていないコードを変更しようとしました。実際、多くのコンパイラは、文字列リテラルを、書き込まれない可能性のある特別なセクションに配置します。

于 2013-01-27T11:42:46.987 に答える
1

このコード行は、変更できない文字列リテラルを作成します。読み取りのみ可能です。

char *s1 = "string1";

変更しようとするとエラーが発生します。

コメントした例:

 char s1[] = "string1";

実際の配列を作成します。これは通常どおり編集して使用できます。

于 2013-01-27T11:43:19.060 に答える