vertical underfull there overleaf maketitle here hbox error end blank badness c

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 estar free() ''ed
  • necesita asignar n + 1 bytes para una cadena de longitud n (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:

  1. use malloc() luego strcpy() luego free() ;
  2. convierta str en una matriz y use strcpy() ;
  3. 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 .