2017-02-13 3 views
-2

Назначение C=R.c_str(); в коде ниже причины G ++, чтобы бросить следующее сообщение об ошибке:ошибка: неправильное преобразование из «сопзЬ символ *» в «символ *» [-fpermissive]

error: invalid conversion from 'const char*' to 'char*' [-fpermissive]"

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string R = "killme"; 
    char *C = new char[100]; 
    C=R.c_str(); 
    cout<<*C; 
} 

Почему это ошибка и как я могу ее решить?

ответ

1

Код имеет две проблемы. Основной причиной, которая вызывает компиляцию, является присвоение c_str() результата, который составляет const, переменной C, что составляет неconst. Компилятор теги это как ошибку, потому что в противном случае вы могли бы сделать это:

C=R.c_str(); 
C[2] = 'c'; 

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

можно исправить двумя способами:

  • Объявить Cconst, т.е. const char *C = ... или
  • Скопируйте содержимое в пространство, которое вы выделили.

Первый подход прост - вы это делаете:

const char *C = R.c_str(); 

Второй подход работает следующим образом:

char *C = new char[R.size()+1]; 
std::strcpy(C, R.c_str()); 

Вторая проблема утечки памяти: код присваивает C в результат new, но не удаляет его. Если вы используете strcpy подход, вам нужно добавить

delete[] C; 

в конце вашей программы, как только вы сделали с помощью переменной C.

+0

Почему бы не просто бросить? , например. char * c = (char *) myStdStr.c_str(); – hfrmobile

+0

@hfrmobile Это будет отлично работать для примера OP, если вы добавите 'const'. Тем не менее, это не сработало бы вообще, потому что у вас нет контроля над тем, что возвращает 'c_str()': как только вы изменяете строку, или строка выходит за пределы области, указатель, который вы вернули из 'c_str() 'становится недействительным. Вот почему создание копии обеспечивает более безопасную альтернативу. – dasblinkenlight

-1

string :: c_str() возвращает const char * не char *. Это и является причиной ошибки.

Для получения дополнительной информации станда :: струнной :: c_str() см ссылки: http://www.cplusplus.com/reference/string/string/c_str/

Да, обе точки, упомянутая выше, также является правильной.

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