Error de bus: error 10

Aqui esta mi codigo

#import  #import  int main(int argc, const char *argv[]) { char *str = "First string"; char *str2 = "Second string"; strcpy(str, str2); return 0; } 

Se comstack bien sin ningún aviso o error, pero cuando ejecuto la aplicación, recibo ese error.

 Bus error: 10 

¿Qué extraño?

Por un lado, no puedes modificar los literales de cadena. Es un comportamiento indefinido.

Para arreglar eso puedes hacer que str una matriz local:

 char str[] = "First string"; 

Ahora, tendrá un segundo problema, es que str no es lo suficientemente grande como para mantener str2 . Por lo que tendrá que boost la longitud de la misma. De lo contrario, rebasará str , que también es un comportamiento indefinido.

Para solucionar este segundo problema, debes hacer str al menos tanto como str2 . O asignarlo dinámicamente:

 char *str2 = "Second string"; char *str = malloc(strlen(str2) + 1); // Allocate memory // Maybe check for NULL. strcpy(str, str2); // Always remember to free it. free(str); 

Hay otras formas más elegantes de hacer esto con los VLA (en C99) y la asignación de stack, pero no voy a entrar en ellos ya que su uso es algo cuestionable.


Como @SangeethSaravanaraj señaló en los comentarios, todos perdieron el #import . Debería ser #include :

 #include  #include  

No hay espacio asignado para las cadenas. utilizar punteros de matriz (o) con malloc() y free()

Aparte de eso

 #import  #import  

debiera ser

 #include  #include  

NOTA:

  • cualquier cosa que sea malloc() ed debe ser free() ‘ed
  • necesita asignar n + 1 bytes para una cadena de longitud n (el último byte es para \0 )

Por favor le damos el siguiente código como referencia.

 #include  #include  #include  int main(int argc, char *argv[]) { //char *str1 = "First string"; char *str1 = "First string is a big string"; char *str2 = NULL; if ((str2 = (char *) malloc(sizeof(char) * strlen(str1) + 1)) == NULL) { printf("unable to allocate memory \n"); return -1; } strcpy(str2, str1); printf("str1 : %s \n", str1); printf("str2 : %s \n", str2); free(str2); return 0; } 

str2 está apuntando a una matriz de caracteres constantes asignados estáticamente. No puedes escribir en ella / sobre ella. *alloc asignar espacio dinámicamente a través de la familia de funciones *alloc .

Su código intenta sobrescribir una cadena literal. Este es un comportamiento indefinido.

Hay varias formas de solucionar esto:

  1. use malloc() luego strcpy() luego free() ;
  2. convierte str en una matriz y usa strcpy() ;
  3. utilizar strdup() .

esto se debe a que str apunta a una cadena literal significa una cadena constante … pero está intentando modificarla copiando. Nota: si hubiera sido un error debido a la asignación de memoria, se le habría dado una falla de segmentación en el tiempo de ejecución. Pero este error se debe a una modificación constante de la cadena o puede consultar la siguiente información para obtener más información sobre el error de bus de abt:

Los errores de bus son raros hoy en día en x86 y ocurren cuando su procesador ni siquiera puede intentar acceder a la memoria solicitada, por lo general:

  • utilizando una instrucción del procesador con una dirección que no satisface sus requisitos de alineación.

Las fallas de segmentación ocurren cuando se accede a la memoria que no pertenece a su proceso, son muy comunes y generalmente son el resultado de:

  • usando un puntero a algo que fue desasignado.
  • utilizando un puntero no inicializado, por lo tanto, falso.
  • utilizando un puntero nulo.
  • desbordando un búfer.

Para ser más precisos, esto no es manipular el puntero en sí, lo que causará problemas, es acceder a la memoria a la que apunta (desreferenciación).

Los literales de cadena no son modificables en C

Siempre que esté utilizando variables de puntero (el asterisco) como

char *str = "First string";

necesitas asignarle memoria

str = malloc(strlen(*str))