Dúvida com struct e malloc, acho que essa é bem difícil

1. Dúvida com struct e malloc, acho que essa é bem difícil

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 26/01/2023 - 22:17h

Boa Noite a todos,

Preciso de uma struct onde seus campos internos sejam alocados dinâmicamente e a qtd de registro dela também seja alocada dinâmicamente.
E minha dúvida é não fazer idéia de como é possível implementar isso! Apenas acredito que seja possível fazer isso com malloc.

Abaixo uma idéia do tamanho que preciso dos campos, lembrando que eles podem variar para mais que isso! E muitos usam muito menos que isso!
struct {
char
Field1[ 20],
Field2[ 20],
Field3[ 1001],
Field4[ 1001],
Field5[ 1001],
Field6[30000];
} Fields[50000];

Penso que a struct precisa ser declarada como um ponteiro, mas não sei fazer isso direito!
struct {
char
*Field1,
*Field2,
*Field3,
*Field4,
*Field5,
*Field6;
} *Fields; // Seria assim aqui???

Ao cadastrar, na hora de salvar cada registro imagino que eu aloco o que preciso para cada campo, na forma abaixo, os campos estão no tamanho do registro!
REGISTRO I - 15350 bytes
Field1 = malloc(20);
Field2 = malloc(20);
Field3 = malloc(100);
Field4 = malloc(80);
Field5 = malloc(130);
Field6 = malloc(15000);

REGISTRO II - 3320 bytes
Field1 = malloc(20);
Field2 = malloc(20);
Field3 = malloc(50);
Field4 = malloc(30);
Field5 = malloc(200);
Field6 = malloc(3000);

Imaginando que até aqui esteja certo, como vou alocar Fields[1] visto que cadastrei 2 registros!
Lembrando que como mostro nos registros acima, cada registro terá valores de campos diferentes que podem ser 1 byte ou 100 mil bytes
No lugar dos números entrará uma variavel int com a qtd de bytes necessárias para alocação, tipo malloc(bytes)

Seria algo assim?
Fields = malloc(18670); // Soma de bytes dos 2 registros 

E como Fields se tornaria Fields[1] ? Ou seja 2 registros na struct?
Alguém consegue me ajudar em como uso malloc pra fazer isso? Porque estou completamente confuso!

Pode ser um exemplo de 2 registros, mostrei 6 pq usarei 6. Minha dúvida principal é como alocar a struct contendo tudo nela! Ao cadastrar 1 registro. Não sei se é alocado separado como mostrei acima ou se é apenas 1 comando que aloca tudo!

Foquei no malloc, pq é a primeira coisa a se fazer, sei que no 2º registro terei que usar realloc, mas ai é mais fácil após saber como cadastrar o primeiro, apenas lembrando que cada registro tem um tamanho diferente, se isso é possível alocar!

Acho que também entendi que minha struct é um vetor de vetores de ponteiros de char (Uma matriz com 1 linha e 6 colunas)
char *Fields[0][6]; // Uma linha com 6 campos (6 ponteiros de char) 



  


2. Re: Dúvida com struct e malloc, acho que essa é bem difícil

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 26/01/2023 - 22:18h

R: Boa noite! O seu código acima está correto, o problema é que ele não está alocando espaço para os campos da struct.
Você precisa alocar os campos um a um, fazendo assim:


struct {
char
*Field1,
*Field2,
*Field3,
*Field4,
*Field5,
*Field6;
} *Fields;

//Alocação dos campos da struct para o registro I
Fields->Field1 = malloc(20);
Fields->Field2 = malloc(20);
Fields->Field3 = malloc(1001);
Fields->Field4 = malloc(1001);
Fields->Field5 = malloc(1001);
Fields->Field6 = malloc(30000);

//Alocação dos campos da struct para o registro II
Fields->Field1 = malloc(20);
Fields->Field2 = malloc(20);
Fields->Field3 = malloc(50);
Fields->Field4 = malloc(30);
Fields->Field5 = malloc(200);
Fields->Field6 = malloc(3000);


Depois disso, você deve liberar a memória com a função free() para não ter problemas de vazamentos de memória. Assim como na alocação, você precisa liberar os campos um a um.

Espero ter ajudado!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts