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:
malloc()
ed debe ser free()
‘ed 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:
malloc()
luego strcpy()
luego free()
; str
en una matriz y usa strcpy()
; 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:
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:
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))