1. ホーム
  2. c

[解決済み] マップされた領域に対する不正なアクセス権 [重複].

2022-02-18 10:45:56

質問

以下の関数を実行しようとすると、エラーが発生します。

   char* reverseInPlace(char* src)
{
    //no need to alloc or free memory
    int i=0;
    int size=mystrlen(src);
    for(i=0;i<size;i++)
    {
        int j=size-i-1;

        if(i<j)
        {
            char temp;
            printf("Interchange start %d:%c with %d:%c",i,src[i],j,src[j]);
            temp=src[i];
            src[i]=src[j];//error occurs here
            src[j]=temp;
            printf("Interchange complete %d:%c and %d:%c",i,src[i],j,src[j]);
        }   
    }
    return src; 
}

このコードをこう呼んでいます。

char* rev2=reverseInPlace("BeforeSunrise");
printf("The reversed string is %s\n",rev2);

エラーの内容はこのようなものです。

Interchange start 0:B with 12:e
Process terminating with default action of signal 11 (SIGSEGV)
Bad permissions for mapped region at address 0x401165

なぜこのようなエラーが発生するのでしょうか?

解決方法は?

関数に定数文字列を渡している。

文字列リテラルの型は char [N + 1] (ここで N は配列の長さ)を変更すると、未定義の動作になります。コンパイラーはその時点ですでに警告を発しているはずです。

もし修正したいのであれば、コピーを作成する必要があります。

char str[] = "BeforeSunrise";
char* rev2=reverseInPlace(str);