c - there - underfull hbox(badness 10000) in paragraph
Error de bus: error 10 (7)
No hay espacio asignado para las cadenas. utilice los punteros de array (o) con malloc()
y free()
Aparte de eso
#import <stdio.h>
#import <string.h>
debiera ser
#include <stdio.h>
#include <string.h>
NOTA:
- cualquier cosa que sea
malloc()
ed debe estarfree()
''ed - necesita asignar
n + 1
bytes para una cadena de longitudn
(el último byte es para/0
)
Por favor, el siguiente código como 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;
}
Aquí está mi código
#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;
}
Se compila muy bien sin ninguna advertencia o error, pero cuando ejecuto la aplicación obtengo ese error
Bus error: 10
¿Qué extraño?
Por un lado, no puede modificar literales de cadena. Es un comportamiento indefinido.
Para solucionarlo, puede hacer que str
una matriz local:
char str[] = "First string";
Ahora, tendrás 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, se sobrepasará str
- que también es un comportamiento indefinido.
Para resolver este segundo problema, debe hacer str
al menos tan largo 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 maneras más elegantes de hacer esto involucrando VLAs (en C99) y asignación de apilamiento, pero no entraré en ellos ya que su uso es algo cuestionable.
Como señaló @SangeethSaravanaraj en los comentarios, todos se perdieron el #import
. Debería ser #include
:
#include <stdio.h>
#include <string.h>
Siempre que use variables de puntero (el asterisco) como
char *str = "First string";
necesitas asignarle memoria
str = malloc(strlen(*str))
Su código intenta sobrescribir un literal de cadena. Este es un comportamiento indefinido.
Hay varias formas de arreglar esto:
- use
malloc()
luegostrcpy()
luegofree()
; - convierta
str
en una matriz y usestrcpy()
; - usa
strdup()
esto se debe a que str está apuntando a un literal de cadena que 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 error 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 información sobre el error del bus abt:
Hoy en día, los errores de bus son raros en x86 y ocurren cuando su procesador no puede siquiera intentar el acceso a memoria solicitado, típicamente:
- usando una instrucción de procesador con una dirección que no satisface sus requisitos de alineación.
Las fallas de segmentación ocurren al acceder 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.
- usando un puntero falso no inicializado.
- usando un puntero nulo.
- desbordando un buffer.
Para ser más precisos, esto no está manipulando el puntero en sí mismo que causará problemas, sino que está accediendo a la memoria a la que apunta (desreferenciación).
los literales de cadena no son modificables en C
str2
apunta a una matriz de caracteres constante asignada estáticamente. No puedes escribir en él / sobre él. Necesita asignar espacio dinámicamente a través de la familia de funciones *alloc
.