2011-03-17 10 views
5

¿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; 
    } 
+7

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

+1

@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. –

+0

@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

Respuesta

22

Los literales de cadena se almacenan en la sección de solo lectura de la memoria. Cualquier intento de modificar el contenido de un literal de cadena invoca Comportamiento no definido (falla de segmentación en la mayoría de las implementaciones).

utilizar una matriz de caracteres en lugar

char str[] = "HelloGuys"; 
+0

aún no puede modificar caracteres individuales dentro de la matriz –

+0

Literales de cadena * podrían almacenarse * en la sección de solo lectura de la memoria –

1

Como ya se ha dicho Prasoon, cadenas literales no son modificables.

Si necesita una matriz modificable de caracteres tienen de esta manera:

char str[] = "HelloGuys"; 
0

Para solucionar este problema, utilizar una matriz en lugar de un puntero a memoria de sólo lectura:

char str[] = "HelloGuys"; // change this line 
int len = strlen(str); 
for (int i=0; i<(len/2); ++i){ 
    char t = str[len-i-1]; 
    str[len-i-1] = str[i]; 
    str[i] = t; 
} 
Cuestiones relacionadas