¿Por qué falla la segmentación en el siguiente código?

Leí esto en wikipedia

int main(void) { char *s = "hello world"; *s = 'H'; } 

Cuando se comstack el progtwig que contiene este código, la cadena “hello world” se coloca en la sección del archivo ejecutable del progtwig marcado como de solo lectura; cuando se carga, el sistema operativo lo coloca con otras cadenas y datos constantes en un segmento de memoria de solo lectura. Cuando se ejecuta, una variable, s, se configura para apuntar a la ubicación de la cadena, y se intenta escribir un carácter H a través de la variable en la memoria, causando una falla de segmentación **

No sé por qué la cadena se coloca en segmento de sólo lectura. Por favor, alguien podría explicar esto.

Los literales de cadena se almacenan en la memoria de solo lectura, así es como funciona. Su código utiliza un puntero inicializado para apuntar a la memoria donde se almacena un literal de cadena, y por lo tanto no puede modificar esa memoria de manera válida.

Para obtener una cadena en la memoria modificable, haga esto:

 char s[] = "hello world"; 

entonces estás bien, ya que ahora solo estás usando la cadena constante para inicializar una matriz no constante.

Hay una gran diferencia entre:

 char * s = "Hello world"; 

y

 char s[] = "Hello world"; 

En el primer caso, s es un indicador de algo que no se puede cambiar. Se almacena en la memoria de solo lectura (normalmente, en la sección de códigos de su aplicación).

En este último caso, asigna una matriz en la memoria de lectura y escritura (normalmente RAM simple), que puede modificar.

  • Cuando lo haces: char *s = "hello world"; entonces s es un puntero que apunta a una memoria que está en la parte del código , por lo que no puede cambiarla.

  • Cuando lo haces: char s[] = "Hello World"; entonces s es una matriz de caracteres que están en la stack , por lo que puede cambiarla.

Si no desea que se cambie la cadena durante el progtwig, es mejor hacerlo: char const *s = ....; . Luego, cuando intenta cambiar la cadena, su progtwig no se bloqueará con la falla de segmentación , surgirá un error del comstackdor (que es mucho mejor).

Primero tengo una buena comprensión de los punteros, les daré una breve demostración:

Primero vamos a analizar su código línea por línea. Vamos a empezar desde lo principal hacia adelante.

char * s = “Some_string”;

en primer lugar, está declarando un puntero a una variable char, ahora * s es una dirección en la memoria, y C le dará una patada si intenta cambiar su valor de memoria, eso es ilegal, por lo que es mejor que declare una matriz de caracteres y luego asigne s a su dirección, luego cambie s.

Espero que lo consigas. Para mayor referencia y comprensión detallada, consulte KN King: progtwigción C Un enfoque moderno

Según la definición del idioma, los literales de cadena deben almacenarse de tal manera que su vida útil se extienda a lo largo de la vida útil del progtwig, y ​​que sean visibles en todo el progtwig.

Exactamente lo que esto significa en términos de dónde se almacena la cadena depende de la implementación ; La definición del idioma no exige que los literales de cadena se almacenen en la memoria de solo lectura, y no todas las implementaciones lo hacen. Solo dice que intentar modificar el contenido de una cadena de caracteres literales en un comportamiento indefinido, lo que significa que la implementación es libre de hacer lo que quiera.