Como usar printf para um ponteiro

Gente, tô tendo um problema com a função showAll(). Quando vou printar o vetor, aparece só o endereço de memória, não o conteúdo dele em si. Acho que provavelmente tô usando de forma errada os ponteiros, mas não sei como concertar.
Outro problema que encontrei é que, se eu não declarar as variáveis ali no começo como sendo vetores, da um erro na hr da execução: “Falha de segmentação. Imagem de núcleo gravada”
Código inteiro:

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

int gsize = 1; //Capacidade de armazenamento da agenda.
int gn = 0; //Número de contatos existentes na agenda.

struct contact
{
	char name[100];
	char street[100];
	char ngbhood[100];
	char city[100];
	char state[100];
	int bday[15];
	int cellnumber[20];
	int number[10];
	int CEP[20];
};

void newContact(struct contact *schedule)
{
	
	schedule = (struct contact *)malloc(sizeof(struct contact)*gsize);
	
	if (gn == gsize) //aumenta a capacidade de armazenamento, caso necessário.
	{
		gsize *= 2;
		schedule = realloc(schedule, sizeof(struct contact)*gsize);
	}
	printf("Nome: ");
	scanf("%s", schedule[gn].name);
	printf("Data de nascimento [ddmmaaaa]: ");
	scanf("%d", schedule[gn].bday);
	printf("Telefone: ");
	scanf("%d", schedule[gn].cellnumber);
	printf("Rua: ");
	scanf("%s", schedule[gn].street);
	printf("Nº: ");
	scanf("%d", schedule[gn].number);
	printf("Bairro: ");
	scanf("%s", schedule[gn].ngbhood);
	printf("CEP: ");
	scanf("%d", schedule[gn].CEP);
	printf("Cidade: ");
	scanf("%s", schedule[gn].city);
	printf("Estado: ");
	scanf("%s", schedule[gn].state);
	printf("==================================");
	printf("\nContato adicionado");
	printf("\n==================================");	
	gn++;
}

void showAll(struct contact *schedule)
{
	if (gn == 0)
		printf("\nNão há nada para exibir aqui.");
	else 
	{
		for (int i = 0; i < gn; i++)
		{
			printf("\n-----------------------------------------");
			printf("\n\t\tVisualizando agenda");
			printf("\n-----------------------------------------");
			printf("\nNome: %s\tData de nasciemnto: %d\tTelefone: %d", schedule[i].name, *schedule[i].bday, *schedule[i].cellnumber);
		}
	}
}


void main()
{
	struct contact schedule;
	int op;
	_Bool truth = 1;
	while (truth)
	{
		printf("\n-----------------------------------------");
		printf("\n\t\tAGENDA");
		printf("\n-----------------------------------------");
		printf("\n[1]Cadastrar novo contato");
		printf("\n[2]Ver contatos");
		printf("\n[3]Pesquisar contatos por nome");
		printf("\n\[4]Alterar informações de contato");
		printf("\n[0]Sair");
		printf("\n-----------------------------------------");
		printf("\nSua resposta: _");
		scanf("%d", &op);
		printf("-------------------\n");
		
		switch (op)
		{
			case 1:
				newContact(&schedule);
				break;
			case 2:
				showAll(&schedule);
				break;
			case 0:
				truth = 0;
				break;
			default:
				printf("Opção inválida.");
				break;
		}
	}
	
}

@Fran.Silva, não tem a restrição:

Nao pode haver desperdıcio de espaco ao armazenar nome, endereco e cidade. Ou seja, esse campos
devem ter seus tamanhos calculados e alocados dinamicamente usando ponteiros e malloc .

nesse exercício?

Para o acesso de membros de estruturas (struct) referenciadas por ponteiro, usa-se o operador seta. Logo, por exemplo:

schedule[i]->name

Não use o ponteiro na chamada, se não ele irá mostrar o endereço da struct.

1 curtida

Sim, tem, mas não sei como usar

Obrigada!