¿Por qué dice "violación de acceso a memoria"?no se puede modificar char * - Violación de acceso a memoria
char* str = "HelloGuys";
int len = strlen(str);
for (int i=0; i<(len/2); ++i){
char t = str[len-i-1];
str[len-i-1] = str[i]; //error
str[i] = t;
}
El idioma es estúpido en este sentido: permite una conversión errónea de 'const char []' a 'char *'. Es decir, implícitamente quita el 'const', engañándote para que piense que es modificable. No es. (Esta conversión se ha eliminado en C++ 0x.) – GManNickG
@GMan: No hay mucha diferencia entre los literales de cadena C y C++. Si todo el literal de cadena es distinto, la implementación se define en C++ y en C no se especifica. Pero en lo que concierne a esta pregunta, cualquier intento de modificar el contenido del literal de cadena invocaría un comportamiento indefinido en C y en C++. Entonces, teniendo en cuenta el código anterior, la diferencia es insignificante. –
@Prasoon: La razón técnica por la cual es diferente, sin embargo. (Técnicamente, tu respuesta tiene el razonamiento equivocado, quiero decir). Ambos dicen "no modifiques los literales de las cadenas, o obtienes un comportamiento indefinido", pero C++ lo hace haciendo que los literales "const", y C lo haga simplemente diciendo " modificar un literal de cadena (que tiene el tipo 'char []') conduce a un comportamiento indefinido ". Mi reversión podría no tener un sentido total, porque anteriormente había comentarios aquí (ahora ahora se eliminan) donde yo y otro discutimos las diferencias técnicas, y tener ambas etiquetas lo hace ambiguo y confuso. – GManNickG