2012-01-03 41 views
30

Aquí está mi códigoError de bus: 10 Error

#import <stdio.h> 
#import <string.h> 

int main(int argc, const char *argv[]) 
{ 
    char *str = "First string"; 
    char *str2 = "Second string"; 

    strcpy(str, str2); 
    return 0; 
} 

Compila bien sin ningún tipo de advertencia o errores, pero cuando corro la aplicación me sale ese error

Bus error: 10 

Lo que echo?

+1

Bueno, 'strlen (str)

+29

¿A todos les falta el '# import'? !! –

+4

@SangeethSaravanaraj Sí, no puedo creerlo yo mismo. jajaja. Todos lo perdieron ... – Mysticial

Respuesta

34

Para empezar, no puede modificar literales de cadena. Es un comportamiento indefinido.

Para solucionar esto se puede hacer str un array local:

char str[] = "First string"; 

Ahora, tendrá un segundo problema, es que str no es lo suficientemente grande como para contener str2. Por lo tanto, necesitará aumentar la longitud de la misma. De lo contrario, rebasará str, que también es un comportamiento indefinido. Para solucionar este segundo problema, debe hacer str al menos tan largo como str2. O asignar de forma dinámica:

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 maneras más elegantes de hacer esto implica VLA (en C99) y pila de asignación, pero no voy a entrar en los que su uso es algo cuestionable.


Como @SangeethSaravanaraj señaló en los comentarios, todo el mundo se perdió la #import. Debe ser #include:

#include <stdio.h> 
#include <string.h> 
+15

Mystical, '# import' es compatible con C tanto para clang como para GCC, y es una extensión object-c. No hay problema con el código del OP, ya que solo agrega guardias de inclusión automática y nada más. –

5

str2 apunta a una matriz de caracteres constante asignada estáticamente. No puedes escribir en él/sobre él. Debe asignar espacio dinámicamente a través de la familia de funciones *alloc.

3

literales de cadena son no modificables en C

4

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

Hay varias maneras de solucionar este problema:

  1. uso malloc() continuación strcpy() continuación free();
  2. convierte str en una matriz y usa strcpy();
  3. use strdup().
7

no hay espacio asignado para las cuerdas.utilizar array (o) punteros con malloc() y free()

Aparte de eso

#import <stdio.h> 
#import <string.h> 

debería ser

#include <stdio.h> 
#include <string.h> 

NOTA:

  • todo lo que es malloc() ed debe ser free() ' ed
  • es necesario asignar n + 1 bytes de una cadena que es de longitud n (el último byte es para \0)

Por favor, que el siguiente código como una referencia

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

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; 
} 
+1

+1 por ser la única persona que notó el '# import' – Mysticial

4

Esto se debe a str es señalar un literal de cadena significa una cadena constante ... pero está intentando modificarlo copiando. Nota: si hubiera sido un error debido a la asignación de la memoria, se le habría dado un fallo de segmentación en el tiempo de ejecución. Pero este error viene debido a la modificación constante de la cadena o puede acceder al siguiente para obtener más detalles.

Bus errors are rare nowadays on x86 and occur when your processor cannot even attempt the memory access requested, typically:

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

Segmentation faults occur when accessing memory which does not belong to your process, they are very common and are typically the result of:

  • usando un puntero a algo que se cancela la asignación.
  • utilizando un puntero falso no inicializado.
  • usando un puntero nulo.
  • desbordamiento de un búfer.

Para ser más precisos, esto no está manipulando el puntero en sí mismo que causará problemas, sino que está accediendo a la memoria que señala (desreferencia).

1

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

char *str = "First string";

que necesita para asign memoria para que

str = malloc(strlen(*str))

Cuestiones relacionadas