映射区域的权限不正确

时间:2014-01-27 17:49:21

标签: c string segmentation-fault

尝试运行以下功能时出错:

   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

为什么会出现此错误?

2 个答案:

答案 0 :(得分:6)

您正在将常量字符串传递给您的函数。

字符串文字在C中的类型为char [N + 1](其中N是数组的长度),但修改它们会导致未定义的行为。您的编译器应该已经发出警告。

如果您想修改它,则必须创建副本:

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

答案 1 :(得分:2)

这是因为您尝试修改字符串文字,这是一个常量数组,即它是只读的。