Eso crashea seguro.
1. str es un puntero y no tiene memoria asignada con lo que puede apuntar a cualquier sitio. O lo cambias por un char [] con tamaño fijo o tmp tienes que asignarle memoria dinámica con malloc. Dependiendo de lo que decidas tmp será útil o sobrará.
2. ¿Liberas la memoria si falla al obtenerla? No se que hará free (NULL) pero no creo que sea buena idea. Y si obtienes la memoria necesaria sales sin liberarla.
3. vector[x - 1].str = "END"; ¿que pasara si el archivo estuviese vacío? Pues que x-1 = -1 y te saldrías del rango. Y además a un array de caracteres no puedes asignarle así una cadena,tienes que usar strcpy o similares.
4. Esta linea:
Es lo mismo que:
Y te ahorras una variable.
5. ¿para que necesitas que tmp sea estática? Eso sobra.
Por cierto no necesitas para nada que el tipo array_s sea una estructura ya que solo tiene un miembro. Para tu caso te valdria algo así y seria más sencillo.
Ahora en lista [0] ya podrías guardar una cadena con la ayuda de fgets.
Y ya puestos no estaría mal que la función en vez de retornar el puntero al tipo retorne el número de líneas copiadas y el tipo lo pasases como parámetro. Si lo haces así yo crearía una función que cuente el número de líneas del archivo y con ese valor ya sabre cuanta memoria necesito con lo que me ahorro llamar a realloc en tu función. Seria algo asi:
Código C++:
Ver originalint nlineas=ContarLineas ("fichero.txt");
if (nlineas >0){
str
*lineas
=(str
*)malloc (sizeof (str
)*nlineas
); if (líneas !=NULL){
int nelementos=OpFile ("fichero.txt",lineas);
if (nelementos == nlineas){
//si coinciden es que todo fue bien
//haces lo que desees con las cadenas
}else {
// hubo algún error al copiar las líneas así que liberamos y salimos
}
}
}
Con eso ya tienes para entretenerte.