Fallo de segmentación

Iniciado por W0lFy, 20 Octubre 2010, 20:49 PM

0 Miembros y 1 Visitante están viendo este tema.

W0lFy

Quisiera cambiar un caracter en una cadena de caracteres, y me da fallo de segmentación. ¿ que ocurre?

char *cadena="Cliente: ";
cadena=cadena+sizeof((char)*2);
*cadena='a';
printf("caracter %c, *cadena);

................-> fallo de segmentación.


Que ocurre? como se puede cambiar en C un caracter de una cadena de longitud dinamica? Un saludo
K@NuT0

ace332

#1
Hola
Respondiendo a tu pregunta, la cadena "Cliente:" C la ubica en un lugar de la memoria que no puede ser modificada en tiempo de ejecución. Si deseas modificar la cadena debes definirla como un arreglo de chars:


char cadena[]="Cliente:";


Ahora, quieres hacer "cadenas de longitud dinámicas" mmmmm...

Los strings en C son cadenas de caracteres terminados con un 0. Osea que puedes agregar o quitar caracteres a la cadena desplazando ese cero...

Te recomiendo darle una revisada a la biblioteca string.h

En fin, espero haber ayudado un poco

Saludos.

W0lFy

#2
veamos el codigo:






#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

struct tcola
{
  char trabajo[80];
  struct tcola *sig;
};
void crear(struct tcola **cola)
{
  *cola = NULL;
}

int vacia(struct tcola *cola)
{
  return (cola == NULL);
}
void encolar(struct tcola **cola, char elem[80])
{
  struct tcola *nuevo;

  nuevo = (struct tcola *) malloc(sizeof(struct tcola));
  nuevo->clave=elem;

  if (*cola == NULL)
  nuevo->sig = nuevo;
  else {
    nuevo->sig = (*cola)->sig;
    (*cola)->sig = nuevo;
  }
  (*cola) = nuevo;
}
void desencolar(struct tcola **c1,char elem[])
{
 struct tcola *aux;
 elem= (c1*)->sig->clave;
if ((*c1) == (*c1)->sig)
{
   free(*c1);
   *c1 = NULL;
 }
else
{
  aux=(*c1);
  (*c1)= aux->sig;
free(aux);
}
printf("en desencolar %s\n",elem);
}

void cliente(int indiceCliente)
{
   char cadena[]="hola que tal";
   cadena[2]='b';
   encolar(&cola,cadena);
}
int main(void)
{

   char *cad;
   crear(&cola);
   cliente(3);// la cola es una variable global
   desencolar(&cola,&cad);
   printf("%s\n",cad);
}

Bueno pos la salida de main me devuelve por un lado
"en desencolar hoba que tal" ( esto es el primer string que uso como banderita)
aqui una cadena de "basura". como si no modificara el valor de la cadena, mi problema es que no se como devolver la cadena de caracteres en el procedimiento desencolar. No se pasarlo bien por referencia... Alguien me ayuda?¿



K@NuT0