映射区域的权限不足

6

我尝试运行以下函数时出现错误:

   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

为什么会出现这个错误?

1
字符串字面值,也称为字符串常量,之所以被称为“常量”,是有原因的。在阅读书籍/教程时请注意。 - user529758
1
顺便说一下,那个问题 ^^ 是谷歌的第一个搜索结果。真的是第一个。不要懒惰。 - user529758
2个回答

9
你正在将一个常量字符串传递给你的函数。
在C中,字符串字面值的类型为char [N + 1](其中N是数组的长度),但修改它们会导致未定义的行为。编译器应该已经在那时发出了警告。
如果你想要修改它,那么你必须创建一个副本:
char str[] = "BeforeSunrise";
char* rev2=reverseInPlace(str);

1
不,字符串字面量既不是const也不是指针。它们是非const数组,但修改它们会导致未定义的行为。此外,断言“[它们]在运行时放置在只读进程内存中”可能是真实的,也可能不是,这与问题完全无关。 - user529758
@H2CO3,即使在C语言中,即使是带有“const”限定符的变量,在C++中也不是真正的“const”,当试图更改它们的值时会导致未定义的行为,这是不是正确的呢? - ajay
1
@ajay 你说的“它们在C++意义上不是真正的const”是什么意思?这与C++无关,这是一个C语言问题。在C语言中,const限定的对象是const限定的,不可修改。就是这样。(是的,修改它们是未定义行为。) - user529758

2

这是因为你试图修改一个字符串字面量,它是一个常量数组,也就是说它是只读的。


1
很遗憾,它是只读的,但不是常量(假设您所说的“常量”是指“const限定符”)。 (这是C ++做对了而C做错了的情况之一。) - user529758
@H2CO3 所以C++就像是“别试图改变一个常量!”而C语言则像是“好吧,随便你,我不在乎”,然后后来说,“我告诉过你了!把它当作一个常量处理!” - ajay
1
@ajay 不是这样的。在C语言中,字符串字面值不是“const”限定的。在C语言中明确修改一个“const”对象会导致编译器报错。 - user529758
@H2CO3 感谢您澄清并消除我所持有的这个错误想法。我刚刚检查了它,并得到了一个平面编译错误。永远在学习中,一步一个脚印 :) - ajay
1
@ajay 的教训是:不要一概而论。 “字符串文字的行为方式”并不意味着“C语言中的所有内容都以那种特定方式行事”。 - user529758

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接