Digamos que eu tenha um array de ponteiros para structs. Como faço para que cada elemento do array aponte para um local de memória diferente, para que eu possa alterar esses valores de struct por meio de ponteiros individualmente?
Alguns exemplos de código:
struct Person {
int age;
char *name[64];
}
int main() {
struct Person *people[4];
struct Person tmp_person;
people[0] = &tmp_person;
people[0]->age = 12;
people[0]->name = "John";
people[1] = &tmp_person;
people[1]->age = 34;
people[1]->name = "Mike";
}
Aqui, cada elemento pessoa será o mesmo, já que todos os elementos do array apontam para a mesma memória ( tmp_person
). Sei que o código está incorreto, estou apenas tentando fazer um exemplo. Então, como faço ponteiros únicos? Criar uma nova variável para cada elemento ( tmp_person1
, tmp_person2
, ...) parece estúpido e muito difícil.
Como dbush disse: O caso mais típico, e provavelmente o que você (não sei se você) quer é um array de objetos , não apenas ponteiros para objetos:
Corrigi o tipo de
name
para um ponteiro simples; isso funciona melhor com strings estáticas como no seu exemplo. Você poderia usar um array de chars, mas teria que inicializá-los comstrcpy
ormemcpy
— não se pode atribuir arrays.Também mostrei como inicializar o array diretamente, o que funciona se você conhece os dados no momento da programação, como no seu exemplo.
Você certamente pode usar uma matriz de ponteiros para structs, como mostrado na última parte; normalmente, os objetos apontados seriam alocados dinamicamente com malloc (e posteriormente liberados).
E eu escrevi uma pequena função que imprime uma pessoa só para mostrar o conteúdo.
malloc
pode ser usado para alocar memória conforme necessário.Com
struct Person *people
múltiplas estruturas pode ser alocado para o ponteiro. Este exemplo aloca memória para três estruturas.Com uma matriz de ponteiros, a memória pode ser alocada para cada ponteiro.