C / C ++ Char Pointer Crash

Digamos que una función que devuelve una cadena fija de ‘texto aleatorio’ se escribe como

char *Function1() { return “Some text”; } 

entonces el progtwig podría fallar si accidentalmente intentara alterar el valor haciendo

 Function1()[1]='a'; 

¿Cuáles son los corchetes después de que la función que intenta hacer haga que el progtwig se bloquee? Si estás familiarizado con esto, cualquier explicación sería muy apreciada.

La cadena que está devolviendo en la función generalmente se almacena en una parte de solo lectura de su proceso. Intentar modificarlo causará una violación de acceso. (EDIT: Estrictamente hablando, es un comportamiento indefinido, y en algunos sistemas causará una infracción de acceso. Gracias, John).

Este es el caso generalmente porque la cadena en sí está codificada junto con el código de su aplicación. Al cargar, los punteros se establecen para señalar aquellas secciones de solo lectura de su proceso que contienen cadenas literales. De hecho, cada vez que escribes una cadena en C, se trata como un const char* (un puntero a la memoria constante).

La firma de esa función debería ser realmente const char* Function(); .

Estás intentando modificar una cadena literal. Según el Estándar, esto evoca un comportamiento indefinido . Otra cosa a tener en cuenta (relacionada) es que los literales de cadena son siempre de tipo const char* . Existe una dispensación especial para convertir un puntero en un literal de cadena a char* , eliminando el calificador const , pero la cadena subyacente aún es constante . Entonces, al hacer lo que estás haciendo, estás intentando modificar una const . Esto también evoca un comportamiento indefinido, y es similar a tratar de hacer esto:

 const char* val = "hello"; char* modifyable_val = const_cast(val); modifyable_val[1] = 'n'; // this evokes UB 

En lugar de devolver un const char* de su función, devuelva una string por valor. Esto construirá una nueva string basada en la cadena literal, y el código de llamada puede hacer lo que quiera:

 #include  std::string Function1() { return “Some text”; } 

…luego:

 std::string s = Function1(); s[1] = 'a'; 

Ahora, si está tratando de cambiar el valor que la Function() vuelve a activar, entonces tendrá que hacer otra cosa. Yo usaría una clase:

 #include  class MyGizmo { public: std::string str_; MyGizmo() : str_("Some text") {}; }; int main() { MyGizmo gizmo; gizmo.str_[1] = 'n'; } 

Puede usar una cadena de caracteres estática para el valor de retorno, pero nunca la usa. Es como un error de violación de acceso. Su comportamiento no está definido en c ++ Standard.

No son los paréntesis, sino la asignación. Su función no devuelve un simple char *, sino un const const * (puedo estar equivocado aquí, pero la memoria es de solo lectura aquí), así que intenta cambiar la memoria incambiable. Y los corchetes, simplemente te dan acceso al elemento de la matriz.

Tenga en cuenta también que puede evitar el locking colocando el texto en una matriz regular:

 char Function1Str[] = "Some text"; char *Function1() { return Function1Str; } 

La pregunta muestra que no entiendes los literales de cadena.

imagen este código

 char* pch = "Here is some text"; char* pch2 = "some text"; char* pch3 = "Here is"; 

Ahora, la forma en que el comstackdor asigna memoria a las cadenas es una cuestión del comstackdor. la memoria podría organizarse así:

 Here isHere is some text 

con pch2 apuntando a la ubicación de la memoria dentro de la cadena pch.

La clave aquí es entender la memoria. Utilizar la Biblioteca de plantillas estándar (stl) sería una buena práctica, pero puede ser una curva de aprendizaje bastante pronunciada para usted.