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中的所有内容都以特定的方式运行”。