Falha na leitura de arquivo em C

O objetivo do código é ler as linhas de um arquivo e armazená-las numa variável temporária (temp[]) e depois passar para a variável definitiva da struct (*line) através da função strcpy(); isso é feito na função load_info().
No main() eu abro o arquivo e chamo a função que realiza o que descrevi acima e, como pode ser visto no código, eu estou alocando os espaços para armazenamento através de malloc().

O problema é: ele só lê a primeira linha e dá erro (“a.exe parou de funcionar” é o que aparece).

Realmente não sei no quê o erro se encontra, se na utilização do malloc ou o que quer que seja, e por conta disso ficou bem difícil para eu pesquisar e encontrar uma solução… Gostaria de uma explicação sobre o que está acontecendo e como posso corrigir.

Conteúdo do arquivo:
alfabeto_entrada={a,b}
alfabeto_saida={a,c}
estados={q0,q1,q2}
inicial=q0
finais=q2
(q0,a)=(q1,@)
(q1,a)=(q1,a)
(q1,b)=(q2,c)
(q2,a)=(q1,@)

Nota: as linhas podem ser substituídas por qualquer outra coisa (“aaaaa”, “bbbbbb”), as dadas são apenas o conteúdo do trabalho que estou fazendo.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 50

typedef struct{
    char *line;
}INFO;


void load_info(INFO *vet[], FILE *arq){
    int k;
    char temp[100];

    for(k = 0; !feof(arq); k++){
        vet[k] = (INFO*)malloc(sizeof(INFO)+1);

        fscanf(arq, "%[^\n]%*c", temp); //lê e guarda a linha do arquivo em 'temp'.
        vet[k]->line = (char*)malloc(sizeof(strlen(temp))+1);
        strcpy(vet[k]->line, temp);

        printf("test; vet[%d]->line: %s\n", k, vet[k]->line);
    }
}


int main(){
    INFO *v[MAX];
    
    FILE *arq;

    arq = fopen("arq.txt", "r");

    if(arq == NULL){
        printf("error\n");
    }else printf("the file was opened\n");

    load_info(v, arq);

    return 0;
}

ok, consegui solucionar o problema ajeitando a sintaxe da função malloc(); segue:

na função load_info(), linha 20:
de:
vet[k]->line = (char*)malloc(sizeof(strlen(temp))+1);
alterei para:
vet[k]->line = malloc(sizeof(char)*(strlen(temp)+1));

faz sentido ao pensar que não é compreensível pedir ao malloc() alocar um espaço sem determinar qual o tipo de espaço que quero alocar; sem dizer à ele que eu quero, por exemplo, um tamanho 30 de char, o que resultaria em 30 bytes (30 x 1), pois cada char ocupa 1 byte, ou 30 de int, o que resultaria em 120 bytes (30 x 4), considerando uma arquitetura onde o int ocupe 4 bytes na memória.

seria como dizer: quero um espaço de 30. e ele responde: ok, mas 30 o quê?
o ponto é: falta informação.

mas isso é puro achismo porque ainda não encontrei um artigo ou matéria que explique exatamente o funcionamento de malloc().

enfim, ainda aceito explicações concretas e indicações de leitura para entender sobre o assunto :grinning:

1 curtida