Подтвердить что ты не робот

Устаревшее преобразование из строковой константы в 'char *'

Возможный дубликат:
С++ устаревшее преобразование из строковой константы в 'char *'

Я хочу передать строку через char * в функцию.

 char *Type = new char[10];
 Type = "Access";  // ERROR

Однако я получаю эту ошибку:

 error: deprecated conversion from string constant to 'char*'

Как я могу это исправить?

4b9b3361

Ответ 1

Если вы действительно хотите изменить тип:

char *Type = new char[10];
strcpy( Type, "Access" );

Если вы не хотите изменять доступ:

const char *Type = "Access";

Обратите внимание, что, однако, массивы char в C и на С++ имеют множество проблем. Например, вы действительно не знаете, был ли успешный вызов нового или был ли он создан для исключения. Кроме того, strcpy() может превзойти предел 10 символов.

Итак, вы можете рассмотреть, если вы хотите изменить тип позже:

std::string Type = "Access";

И если вы не хотите его изменять:

const std::string Type = "Access";

... преимущество использования std::string заключается в том, что он способен справиться со всеми этими проблемами.

Ответ 2

Здесь есть несколько вещей.

char *Type = new char[10];

Создайте указатель char* с именем Type и инициализируйте его, чтобы указать на первый элемент вновь выделенного 10-элементного массива.

Type = "Access";  // ERROR

Это задание не делает то, что вы думаете. Он не копирует 6-символьную строку "Access" (7 символов, включая завершающий '\0'), к только что созданному массиву. Вместо этого он назначает указатель на первый элемент этого массива в ваш указатель Type. Есть две проблемы с этим.

Во-первых, он clobbers предыдущее значение Type. Этот 10-символьный массив, который вы только что выделили, ничто не указывает на него; вы больше не можете получить к нему доступ или даже освободить его. Это утечка памяти.

Это не то, о чем компилятор жалуется.

Во-вторых, строковый литерал создает статически выделенный массив const ( "статически распределенный", что означает, что он существует для всего выполнения вашей программы). Type не объявляется с помощью const. Если компилятор разрешил вам указывать Type на строку "Access", вы можете использовать этот указатель для (попытаться) изменить его:

Type = "Access";
Type[0] = 'a'; // try to change the string to "access"

Цель const состоит в том, чтобы запретить вам изменять или даже пытаться модифицировать вещи, доступные только для чтения. Поэтому вам не разрешено присваивать значение указателя не const const объекту const const.

Поскольку вы программируете на С++, вам, вероятно, лучше использовать std::string.

Ответ 3

Я хочу передать строку через char * в функцию.

Вот как вы можете передать строку через char * в функцию (обратите внимание на требуемое ключевое слово const в сигнатуре функции.)

#include <iostream>
void f(const char* p) {
  std::cout << p << "\n";
}

int main() {
  f("Access");
}

Но что, если вы вызываете существующую функцию и не можете изменить ее подпись?

Если у вас есть внешняя гарантия того, что функция не будет писать через указатель аргумента,

#include <iostream>
void f(char* p) {
  std::cout << p << "\n";
}

int main() {
  f(const_cast<char*>("Access"));
}

Если, с другой стороны, функция может писать в строку, тогда вам нужно выделить место для строки:

#include <iostream>
void f(char* p) {
  *++p;
  std::cout << p << "\n";
}

int main() {
  // Allocate read-write space on the heap
  char *p = new char[strlen("Access"+1)];
  // Copy string to allocated space
  strcpy(p, "Access");
  f(p);
  delete p;
}

или,

#include <iostream>
void f(char* p) {
  *++p;
  std::cout << p << "\n";
}

int main() {
  // Allocate read-write space on the stack
  char arr[] = "Access";
  f(arr);
}

Но наилучшим курсом, безусловно, является избегание всех мизерных указателей:

#include <iostream>
void f(const std::string& p) {
  std::cout << p << "\n";
}

int main() {
  f("Access");
}

Ответ 4

У вас проблема с основными операциями, а не проблема с кодировкой.

Если вы хотите изменить содержимое массива C char, вы не используете оператор присваивания. Это вместо этого изменит значение основного указателя. Ик.

Вместо этого вы должны использовать подпрограммы библиотеки строк C. Например, strcpy (Type, "Access"); скопирует строковый литерал "Access" в ваш массив символов со своим всеохватывающим конечным нулевым символом.

Если вы используете С++ (как указывают теги), вероятно, вы должны использовать std::string вместо массивов char. Назначение работает так, как вы ожидаете.