Pregunta

Mi programa es así ( main.c ):

#include <stdlib.h>
#include <stdio.h>
void main(){
  char *first="hello ";
  char *second="world!";
  char *seq=(char *)malloc((strlen(first)+1)*sizeof(char));
  strcat(strcpy(seq,first),second);
  printf("%s\n",seq);
  free(seq);
}

y depuración con el valgrind herramienta, se dice que ($: valgrind --tool = memcheck --leak-check = completos --track-orígenes = yes ./main):

==5118== Memcheck, a memory error detector.
==5118== Copyright (C) 2002-2008, and GNU GPL'd, by Julian Seward et al.
==5118== Using LibVEX rev 1884, a library for dynamic binary translation.
==5118== Copyright (C) 2004-2008, and GNU GPL'd, by OpenWorks LLP.
==5118== Using valgrind-3.4.1, a dynamic binary instrumentation framework.
==5118== Copyright (C) 2000-2008, and GNU GPL'd, by Julian Seward et al.
==5118== For more details, rerun with: -v
==5118== 
==5118== Invalid write of size 1
==5118==    at 0x402575B: strcat (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5118==    by 0x80484EB: main (main.c:7)
==5118==  Address 0x418a02f is 0 bytes after a block of size 7 alloc'd
==5118==    at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5118==    by 0x80484C3: main (main.c:6)
==5118== 
==5118== Invalid write of size 1
==5118==    at 0x4025777: strcat (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5118==    by 0x80484EB: main (main.c:7)
==5118==  Address 0x418a034 is 5 bytes after a block of size 7 alloc'd
==5118==    at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5118==    by 0x80484C3: main (main.c:6)
==5118== 
==5118== Invalid read of size 1
==5118==    at 0x4025963: strlen (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5118==    by 0x40A0FA4: puts (in /lib/libc-2.10.1.so)
==5118==    by 0x80484F7: main (main.c:8)
==5118==  Address 0x418a02f is 0 bytes after a block of size 7 alloc'd
==5118==    at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5118==    by 0x80484C3: main (main.c:6)
==5118== 
==5118== Invalid read of size 1
==5118==    at 0x40ACEFE: _IO_default_xsputn (in /lib/libc-2.10.1.so)
==5118==    by 0x40AA3D0: _IO_file_xsputn@@GLIBC_2.1 (in /lib/libc-2.10.1.so)
==5118==    by 0x40A1020: puts (in /lib/libc-2.10.1.so)
==5118==    by 0x80484F7: main (main.c:8)
==5118==  Address 0x418a02f is 0 bytes after a block of size 7 alloc'd
==5118==    at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5118==    by 0x80484C3: main (main.c:6)
hello world!
==5118== 
==5118== ERROR SUMMARY: 17 errors from 4 contexts (suppressed: 13 from 1)
==5118== malloc/free: in use at exit: 7 bytes in 1 blocks.
==5118== malloc/free: 1 allocs, 0 frees, 7 bytes allocated.
==5118== For counts of detected errors, rerun with: -v
==5118== searching for pointers to 1 not-freed blocks.
==5118== checked 47,492 bytes.
==5118== 
==5118== 
==5118== 7 bytes in 1 blocks are definitely lost in loss record 1 of 1
==5118==    at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==5118==    by 0x80484C3: main (main.c:6)
==5118== 
==5118== LEAK SUMMARY:
==5118==    definitely lost: 7 bytes in 1 blocks.
==5118==      possibly lost: 0 bytes in 0 blocks.
==5118==    still reachable: 0 bytes in 0 blocks.
==5118==         suppressed: 0 bytes in 0 blocks.

¿Quién me puede decir por qué y cómo solucionarlo.

¿Fue útil?

Solución

 char *seq=(char *)malloc((strlen(first)+1)*sizeof(char));

Se están asignando memoria para una cadena del tamaño de simplemente 'primero'.

  strcat(strcpy(seq,first),second);

Y a continuación, intenta adaptarse primera y segunda en el mismo. Eso nunca va a trabajar. strcat no crea más memoria, es necesario que se incluyan en el que malloc.

No hay necesidad de emitir el resultado de malloc en C pura

También es no es necesario hacer sizeof(char), ya que se garantiza que sea 1. Algunos gustaría tenerlo allí de todos modos ser explict sobre el tipo en caso de que cambia, algunos consideran que es el desorden.

Otros consejos

¿Dónde está la free() correspondiente para el malloc()?

Se están asignando sólo lo suficiente espacio para por primera vez en la SEC.

ss sólo es (strlen (primera) 1) * sizeof (char) de largo, no es suficiente para mantener la cadena concatenada primera + segunda.

pude ver que la línea:

strcat (strcpy (SEC, primero), segundos);

No está enmarcada erróneamente. La razón es, que está haciendo una concatenación de cadenas, en el que no está dando una fuente adecuada. No tendrán ningún problema, si seggregate la sintaxis anterior en 2 líneas.

strcpy (SEC, primero); strcat (SEC, segundos);

Esto se debe a que, cuando usted está haciendo una copia de cadena, copiará la cadena de "primera" a "ss". Ahora, por la concatenación de cadenas, ya que no pudo encontrar la fuente adecuada [recordar que nose menciona específicamente que la fuente es "ss"], se está dando un problema de pérdida de memoria de escritura no válido.

Espero que esto aclara su pregunta. Por favor, volver, si se requiere cualquier información adicional, por la misma.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top