Pregunta

mi código está segregado y no sé por qué.

 1  #include <stdio.h>
 2
 3  void overwrite(char str[], char x) {
 4    int i;
 5    for (i = 0; str[i] != '\0'; i++)
 6      str[i] = x;
 7  }
 8
 9  int main(void) {
10    char *s = "abcde";
11    char x = 'X';
12    overwrite(s, x);
13    printf("%s\n", s);
14    return 0;
15  }

El depurador gdb me dice que el problema está en la línea 6, donde quiero almacenar un char, en c-string (si uso la desreferenciación de punteros de valores, es el mismo problema). Esto es lo que dice:

(gdb) run
Starting program: /tmp/x/x 

Breakpoint 1, overwrite (str=0x8048500 "abcde", x=88 'X') at x.c:5
5         for (i = 0; str[i] != '\0'; i++)
(gdb) s
6           str[i] = x;
(gdb) 

Program received signal SIGSEGV, Segmentation fault.
0x080483e3 in overwrite (str=0x8048500 "abcde", x=88 'X') at x.c:6
6           str[i] = x;
(gdb) q

Estoy aprendiendo del libro K & amp; R-C y este es un ejemplo simplificado del capítulo 2.8 (la función de eliminación). No tengo idea de dónde está el problema.

¿Fue útil?

Solución

porque char * s = " abcde " ;; crea una cadena en la memoria de solo lectura. prueba

char s[] = "abcde";

EDITAR: explicación: char * es puntero, y " abcde " se crea en la memoria de solo lectura - > inmutable.

char [] es una matriz, que se almacena completamente en la pila y se inicializa desde la memoria, por lo que es mutable

Otros consejos

Cuando defina un puntero a un literal de cadena , declare que es const char * .

const char *s = "abcde";

De esa manera, su compilador se queja cuando intenta enviar esa cadena a la función de sobrescritura ().

const char *s = "abcde";
char t[] = "fghij";
char x = 'X';

overwrite(s, x); /* oops */
overwrite(t, x); /* ok */

No en desacuerdo, solo para elaborar: considere lo que sucedería si el compilador lo permitiera. Podrías escribir:

char *s1="abcde";
char *s2="abcde";
s1[0]='x';
puts(s1);
puts(s2);

Si el compilador reconoce que los dos literales son iguales y los reutiliza, pero también permite la línea 3, su salida sería:

xbcde
xbcde

Lo que probablemente no es lo que querrías. Esto sería particularmente misterioso si los dos literales estuvieran en partes del programa muy separadas.

Prueba:

#include <iostream>
#include <cstring>

using namespace std;

void overwrite(char[], char);

int main(void)
{
        char *s = strdup("abcde");
        char X = 'X';
        overwrite(s, X);
        cout << s << endl;

        if(s!=NULL)
                delete [] s;

        return 0;
}

void overwrite(char str[], char x)
{
        for(int i=0; str[i]!='\0'; i++)
                str[i] = x;
}

mi conjetura es la definición del parámetro donde se define el tipo como una matriz de caracteres. Mientras pasas un puntero a un char

Puedes intentar cambiar la primera línea a esto:

 void overwrite(char *str, char x) {

Una matriz char y un puntero char no son semánticamente iguales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top