C cuerdas malloc (salida)

Tengo algunos resultados extraños aquí. ¿Podrías explicarme por qué y cómo resolverlo?

int inp_str(char * string, char ** pointers[]) { char * tmp[stringsCount]; if (strlen(string) > maxlen) return (-1); else { tmp[count] = malloc(sizeof(char) * strlen(string)); strcpy(tmp[count], string); pointers[count] = &tmp[count]; count++; } return count; } int main(){ //char * strings[stringsCount]; char ** pointers[stringsCount]; inp_str( "sdasya", pointers); inp_str( "dasd", pointers); inp_str( "qwe", pointers); inp_str( "dasd", pointers); //sort(pointers, count); printf("%s", *pointers[0]); printf("\n%s", *pointers[1]); printf("\n%s", *pointers[2]); printf("\n%s", *pointers[3]); } 

Aquí está la salida:

 sdasya   uNH  H l$ H \$L d$(L l$0H  8 f.  qwe  bs7 

PD. stringsCount es constante; cuenta = 0

Porque char * tmp[stringsCount]; es una variable local, después de que la función inp_str regresa, la memoria de tmp es reclamada por el sistema. Por lo tanto, los punteros a esa ubicación no son válidos después de que la función regrese.

No estoy seguro de entender lo que intentas hacer aquí. Pero en cualquier caso, hay algunos problemas:

1) Estás copiando una cadena en un puntero sin inicializar. Es decir, crea una matriz de (char *) que apunta a cualquier lugar y luego copia la cadena en esa ubicación. Si está intentando apuntar tmp a su cadena, no use strcpy, simplemente asigne vía tmp [count] = cadena;

2) tmp se crea en la stack, por lo que si asigna su valor a los punteros ** y trata de hacer referencia a la dirección fuera del scope de esta función, esa memoria desaparece y es probable que vea datos corruptos.

Espero que esto ayude. Por curiosidad, ¿qué intentas hacer en esta función?

Además de perder el puntero tmp[] después de que se devuelve la función, también siempre está asignando un byte por debajo de la cantidad real necesaria: strlen(s) devuelve la longitud de una cadena, que no incluye el byte de terminación NUL. Lo que necesita es (tenga en cuenta que sizeof (char) es 1 por definición ):

  char *p = malloc(strlen(string) + 1); strcpy (p, string); 

para duplicar una cadena.