c++ - warning - deprecated conversion from string constant to char*''
conversión obsoleta de cadena constante a ''char*'' (4)
Quiero pasar una cadena a través de char * a una función.
Aquí es cómo puede pasar una cadena a través de char * a una función (tenga en cuenta la palabra clave const
en la firma de la función).
#include <iostream>
void f(const char* p) {
std::cout << p << "/n";
}
int main() {
f("Access");
}
Pero, ¿qué sucede si está invocando una función existente y no puede modificar su firma?
Si tiene alguna garantía externa de que la función no escribirá a través del puntero de su argumento,
#include <iostream>
void f(char* p) {
std::cout << p << "/n";
}
int main() {
f(const_cast<char*>("Access"));
}
Si, por otro lado, la función podría escribir en la cadena, entonces deberá asignar espacio para la cadena:
#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;
}
o,
#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);
}
Pero, por mucho, el mejor curso es evitar todas las mishegas de puntero:
#include <iostream>
void f(const std::string& p) {
std::cout << p << "/n";
}
int main() {
f("Access");
}
Posible duplicado:
Conversión en desuso de C ++ de constante de cadena a ''char *''
Quiero pasar una cadena a través de char * a una función.
char *Type = new char[10];
Type = "Access"; // ERROR
Sin embargo me sale este error:
error: deprecated conversion from string constant to ''char*''
¿Cómo puedo arreglar eso?
Hay un par de cosas sucediendo aquí.
char *Type = new char[10];
Esto crea un puntero char*
denominado Type
y lo inicializa para que apunte al primer elemento de una matriz de 10 elementos recién asignada.
Type = "Access"; // ERROR
Esta tarea no hace lo que crees que hace. No copia la cadena de 6 caracteres "Access"
(7 caracteres, incluida la terminación ''/0''
) a la matriz que acaba de crear. En su lugar, asigna un puntero al primer elemento de esa matriz en su Type
puntero. Hay dos problemas con eso.
Primero, obstruye el valor previo de Type
. Esa matriz de 10 caracteres que acabas de asignar ahora no tiene nada que lo señale; ya no se puede acceder o incluso desasignarlo. Esta es una pérdida de memoria.
Esto no es lo que el compilador se queja.
En segundo lugar, un literal de cadena crea una matriz const asignada estáticamente ("asignada estáticamente", lo que significa que existe para toda la ejecución de su programa). Type
no se declara con un calificador const
. Si el compilador le permitió señalar el Type
a la cadena "Access"
, podría usar ese puntero para (intentar) modificarlo:
Type = "Access";
Type[0] = ''a''; // try to change the string to "access"
El propósito de const
es evitar que modifiques, o incluso intentes modificar, las cosas que son de solo lectura. Es por eso que no se le permite asignar un valor de puntero no constante a un objeto de puntero const.
Ya que estás programando en C ++, probablemente estés mejor usando std::string
.
Si realmente quieres modificar el Tipo:
char *Type = new char[10];
strcpy( Type, "Access" );
Si no quieres modificar el acceso:
const char *Type = "Access";
Tenga en cuenta que, sin embargo, las matrices de char en C y en C ++ vienen con muchos problemas. Por ejemplo, no sabe realmente si la llamada a nuevo ha tenido éxito o si va a lanzar una excepción. Además, strcpy () podría superar el límite de 10 caracteres.
Así que puedes considerar, si deseas modificar el tipo más adelante:
std::string Type = "Access";
Y si no quieres modificarlo:
const std::string Type = "Access";
... la ventaja de usar std::string
es que puede hacer frente a todos estos problemas.
Tienes un problema de operaciones básicas aquí, no un problema de codificación.
Cuando desea cambiar el contenido de una matriz de caracteres C, no utiliza el operador de asignación . Eso cambiará el valor del puntero subyacente. Ick
En su lugar, se supone que debes usar las rutinas de la biblioteca de cadenas C. Por ejemplo, strcpy (Type, "Access");
copiará la cadena literal "Acceso" en la matriz de caracteres, con su carácter nul final muy importante.
Si está utilizando C ++ (como lo indican sus etiquetas), probablemente debería usar std::string
lugar de matrices de char. La asignación funciona de la manera que esperas allí.