2014-01-27 5 views
1

Я получаю сообщение об ошибке при попытке запустить следующую функцию:Плохие разрешения для отображенной области

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

строковых литералов, он же строковые константы, называются «константой» по причине. Обратите внимание при чтении книг/учебников. –

+1

Кстати, этот вопрос ^^ является первым хитом Google. ** Буквально первый. ** Не ленитесь. –

ответ

6

Вы передаете константу в свою функцию.

Строковые литералы имеют тип char [N + 1] (где N - длина массива) на C, но их изменение приводит к неопределенному поведению. В этот момент ваш компилятор должен был выпустить предупреждение.

Если вы хотите изменить его, то вы должны создать копию:

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

Нет, строковые литералы не являются ни константами, ни указателями. Это неконстантные массивы, но их изменение приводит к неопределенному поведению. Более того, утверждение, что «[они] помещены во время выполнения в память процесса только для чтения» может быть или не быть правдой, и это совершенно не имеет отношения к проблеме. –

+0

@ H2CO3 это не правда для даже 'const' квалифицированных переменных в C, что они не являются истинными' const' в смысле C++ и приводят к неопределенному поведению при попытке изменить их значение? – ajay

+1

@ajay Что вы подразумеваете под этим «они не являются истинными константами в смысле C++»? Это не имеет ничего общего с C++, это вопрос C. И в C, 'const' квалифицированные объекты являются' const' квалифицированными и не изменяемыми. Это все. (Да, их изменение - UB.) –

2

Это потому, что вы пытаетесь изменить строковый литерал, который является константным массивом, т. Е. Он доступен только для чтения.

+1

Он доступен только для чтения, но не постоянный (предполагая, что вы имели в виду «const» -ступенчатый »от константы), к сожалению. (Это один из случаев, когда C++ получил это правильно, а C не понял его.) –

+0

@ H2CO3, поэтому C++ похож на «Не пытайтесь изменить константу!». где C - «Ну, вперед, мне все равно», а потом «сказал! рассматривайте его как const! ' – ajay

+1

@ajay Нет. Это то, что строковые литералы не являются 'const'-квалифицированными в C. Явно изменяя объект' const' в C, является жесткой ошибкой компилятора. –

Смежные вопросы