путать со строками, объявленными с использованием указателя, и со строками в c ++ - PullRequest
0 голосов
/ 11 марта 2019

в следующем коде:

using namespace std;

void swap(char *x,char *y){

  char tmp = *x;
  *x = *y;
  *y = tmp;

}

int main(){

 char a[]="ab";
 //char *a ="ab";

 swap( (a+0),(a+1) );
 cout<<a;

 return 0;
}

когда массив a инициализируется как a [] = "ab", функция swap работает, но когда он инициализируется как * a = "ab", он выдает ошибку сегментации, кто-нибудь может сказать почему?

Ответы [ 2 ]

3 голосов
/ 11 марта 2019

char a[]="ab"; - это локальный неконстантный массив.Вы можете изменять неконстантные массивы.

Строковые литералы являются константными.Когда вы инициализируете указатель на строковый литерал, он указывает на объект const.Поведение модифицируемого объекта const не определено.

Даже инициализация char *a ="ab"; является некорректной (начиная с C ++ 11), поскольку строковый литерал неявным образом не преобразуется в указатель на неконстантный char.

0 голосов
/ 11 марта 2019

Это чисто концепция C, прочитайте 5.5. Символьные указатели и функции на языках программирования C, вы будете знать ответ.Проблема в том, что вы не можете изменить строковую константу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...