How to access, within a function, the member of a dynamically allocated structure?

Asked

Viewed 49 times

-1

I have the following code in C:

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

struct pessoa{
 char nome[11];
 int idade;
}
 
void cadastra_pessoa(char novo_nome[11], int nova_idade, struct pessoa *vetor_pessoas, int *quantidade)
{
  vetor_pessoa = realloc(vetor_pessoa, sizeof(struct pessoa) * (++(*quantidade)));
  strcpy(vetor_pessoa[(*quantidade) - 1].nome, novo_nome);
  vetor_pessoa[(*quantidade) - 1].idade = nova_idade;

int main()
{
 int quantidade_de_pessoas = 0;
 struct pessoa *vetor_pessoas = NULL;

 cadastra_pessoa("Robson", 12, vetor_pessoas, &quantidade_de_pessoas);
 cadastra_pessoa("Joao", 31, vetor_pessoas, &quantidade_de_pessoas);
 cadastra_pessoa("Ana", 19, vetor_pessoas, &quantidade_de_pessoas);
 return 0;
}

Whose goal is to dynamically increase the size of the people vector (a pointer to struct) every time a person registers. However, the code within the function cadastra_pessoa(), that should increase the size of the vector by 1 unit at each call and add a person to the last position, it just doesn’t work... the only part that works is the increment of the variable pointed by the pointer quantidade! Interestingly, the same code works fully when it is put out of a function, directly within the main(). Why only inside the function does not work? I should, within the function, access the members of the struct differently or this task is not possible to do through functions?

1 answer

3


The error is in the pointer type variable vetor_pessoas inside main(). Even after function call cadastra_pessoa() the pointer vetor_pessoas continues to point to null. You should make this pointer point to the new memory region allocated by realloc in function cadastra_pessoa(). Remembering that you are past the address pointed by vetor_pessoas for the function cadastra_pessoa(), and not the pointer itself.

One way to solve this problem is to do the function cadastra_pessoa() returns the new allocated memory region and assign to vetor_pessoas. Another way would be the function cadastra_pessoa() receive a pointer to a pointer.

Code below tested in Mingw-GCC compiler version 6.0.3, using the first method I described above

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

#include<string.h> //para uso da função strcpy

struct pessoa{
 char nome[11];
 int idade;
};
 
struct pessoa *  cadastra_pessoa(char novo_nome[11], int nova_idade, struct pessoa *vetor_pessoas, int *quantidade)
{
  vetor_pessoas = realloc(vetor_pessoas, sizeof(struct pessoa) * (++(*quantidade)));
  strcpy(vetor_pessoas[(*quantidade) - 1].nome, novo_nome);
  vetor_pessoas[(*quantidade) - 1].idade = nova_idade;
  return vetor_pessoas;
}

int main(){

 int quantidade_de_pessoas = 0;
 struct pessoa *vetor_pessoas = NULL;

 vetor_pessoas = cadastra_pessoa("Robson", 12, vetor_pessoas, &quantidade_de_pessoas);
 vetor_pessoas = cadastra_pessoa("Joao", 31, vetor_pessoas, &quantidade_de_pessoas);
 vetor_pessoas = cadastra_pessoa("Ana", 19, vetor_pessoas, &quantidade_de_pessoas);

 return 0;
}

Remembering that the pointer vetor_pessoas is a pointer to a memory region continued with structs person type, so that region is an array, so to access the next element you must increment the pointer or index it. For example:

... Mesmo código acima
printf(vetor_pessoas[1].nome) // ou printf((vetor_pessoas+1)->nome) para acessar o nome de João

return 0;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.