Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 映射区域的权限不正确_C_String_Segmentation Fault - Fatal编程技术网

C 映射区域的权限不正确

C 映射区域的权限不正确,c,string,segmentation-fault,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;

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

   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

为什么会发生这种错误

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

您正在向函数传递一个常量字符串

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

如果要修改,则必须创建副本:

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

字符串文字,也称为字符串常量,之所以称为“常量”是有原因的。阅读书籍/教程时要注意。顺便说一句,这个问题^^是谷歌的第一个热门话题。字面上是第一个。不要偷懒。不,字符串文字既不是常量也不是指针。它们是非常量数组,但修改它们会导致未定义的行为。此外,“它们在运行时被放置在只读进程内存中”的断言可能是真的,也可能不是真的,这与问题完全无关。@H2CO3即使对于C中的
const
限定变量也不正确,在C++的意义上,它们不是真的<代码> const <代码>,当试图改变它们的值时会导致未定义的行为?@ Ajay:“它们在C++意义上不是真正的const”是什么意思?这与C++无关,它是一个C问题。在C语言中,
const
限定对象是
const
限定的,不可修改。这就是全部。(是的,修改它们是UB。)不幸的是,它是只读的,但不是常量(假设您的意思是常量“
const
-qualified”)。(这是C++得到正确的一个例子,C++出错了)。而C就像‘好吧,我不在乎’然后‘告诉你!把它当作一个常数@答:不是。这是因为字符串文本在C中不是
const
-限定的。在C中显式修改
const
对象是一个硬编译器错误。@H2CO3感谢您澄清并消除了我的错误想法。我刚刚检查了一下,发现一个简单的编译错误。总是在学习。一步一个脚印:)@ajay吸取的教训:不要一概而论。“字符串文字以特定的方式运行”并不意味着“C中的所有内容都以特定的方式运行”。