Erro em Função para Listar Contatos de uma Agenda Usando Arquivos

Olá a todos, estou tentando fazer uma agenda em linguagem C que tenha um menu na função main e funções para cada opção. Quero que a função para listar os contatos leia um arquivo binário, onde eles estão inseridos.
O problema ocorre quando tento utilizar a função para listar os contatos, já que ela mostra algo mais parecido com endereços de variáveis. Se puderem ajudar, serei muito grato.

Meu código main:

#include <stdio.h>
#include <string.h>
#define ARQUIVO "agenda.bin"

void addContato();
int listarContatos(int tipo_listagem);
void inativar(char inativando[]);

struct agenda
{
	char nome[60], endereco[300], email[50];
	int numero, telefone, ativo;
};

int main(void)
{
	FILE *arq;
	int opcao = 0, sair = 0;
	struct agenda contato;
    
    int opcao_listar = 0; // Variável da função listarContatos();
	int contatos_listados = 0;
	char inativar_contato[60];

	do
	{
		printf("1- Adicionar\n2- Listar contatos\n3- Inativar contato\n\n");
		printf("Digite sua opcao: ");
		scanf("%d", &opcao);

		switch (opcao)
		{
		case 1:
			addContato();
			break;
		case 2:
			do
			{
				printf("\t1- Listar todos os contatos\n\t2- Listar contatos ativos\n\t3- Listar contatos inativos\n");
				scanf("%d", &opcao_listar);
				contatos_listados = listarContatos(opcao_listar);
				printf("\nContatos Listados: %d\n", contatos_listados);
			} while ((opcao_listar < 1) || (opcao_listar > 3));
			break;
		case 3:
			printf("Contato: ");
			fflush(stdin);
			gets(inativar_contato);
			inativar(inativar_contato);
			break;
		}

		fclose(arq);

		int sair = -1;
		printf("Deseja sair [0- Sim | 1- Nao]: ");
		scanf("%d", &sair);

	} while (sair);

	return 0;
}

void addContato()
{
	struct agenda contato;
	FILE *arq;

	if ((arq = fopen(ARQUIVO, "a+b")) == NULL)
	{
		printf("ERRO DE LEITURA DO ARQUIVO!\n");
	}
	else
	{
		rewind(arq);
		fseek(arq, sizeof(struct agenda), SEEK_SET);
		if (fwrite(&contato, sizeof(struct agenda), 1, arq) != 1)
		{
			printf("\nERRO DE GRAVACAO!\n");
		}
		else
		{
			printf("Nome: ");
			fflush(stdin);
			gets(contato.nome);
			printf("Endereco: ");
			fflush(stdin);
			gets(contato.endereco);
			printf("E-mail: ");
			fflush(stdin);
			gets(contato.email);
			printf("Numero: ");
			scanf("%d", &contato.numero);
			printf("Telefone: ");
			scanf("%d", &contato.telefone);
			do
			{
				printf("Ativo [1- Sim | 2- Nao]: ");
				scanf("%d", &contato.ativo);
			} while ((contato.ativo <= 0) || (contato.ativo >= 3));
		}
	}
	fclose(arq);
}

int listarContatos(int tipo_listagem)
{
	int i;
	struct agenda contato;
	FILE *arq;

	if (!(arq = fopen(ARQUIVO, "rb")))
	{
		printf("ERRO DE LEITURA DO ARQUIVO!\n");
	}
	else
	{
		while (!feof(arq))
		{
			if (fread(&contato, sizeof(struct agenda), 1, arq) == 1)
			{
				if (tipo_listagem == 1)
				{
					printf("Nome: %s\n", contato.nome);
					printf("Endereco: %s\n", contato.endereco);
					printf("E-mail: %s\n", contato.email);
					printf("Numero: %d\n", contato.numero);
					printf("Telefone: %d\n", contato.telefone);
					printf("Contato ativo [1- Sim | 2- Nao]: %d\n", contato.ativo);
				}
				else if (tipo_listagem == 2)
				{
					if (contato.ativo == 1)
					{
						printf("Nome: %s\n", contato.nome);
						printf("Endereco: %s\n", contato.endereco);
						printf("E-mail: %s\n", contato.email);
						printf("Numero: %d\n", contato.numero);
						printf("Telefone: %d\n", contato.telefone);
						printf("Contato ativo [1- Sim | 2- Nao]: %d\n", contato.ativo);
					}
				}
				else
				{
					if (contato.ativo == 2)
					{
						printf("Nome: %s\n", contato.nome);
						printf("Endereco: %s\n", contato.endereco);
						printf("E-mail: %s\n", contato.email);
						printf("Numero: %d\n", contato.numero);
						printf("Telefone: %d\n", contato.telefone);
						printf("Contato ativo [1- Sim | 2- Nao]: %d\n", contato.ativo);
					}
				}
			}
		}
		fclose(arq);
		return i++;
	}
}

void inativar(char inativando[])
{
	FILE *arq;
	char alvo[60];
	struct agenda contato;
	int encontrado = 0;
	
	rewind(arq);
	
	while((!feof(arq)) && (encontrado == 0)){
		if(fread(&contato, sizeof(struct agenda), 1, arq) == 1){
			if(!(strcmp(contato.nome, inativando))){
				encontrado = 1;
				contato.ativo = 2;
				fseek(arq, -sizeof(struct agenda), SEEK_CUR);
				if(fwrite(&contato, sizeof(struct agenda), 1, arq) != 1){
					printf("ERRO DE GRAVACAO!\n");
				}
			}
		}
	}
	
	if(encontrado == 0){
		printf("\nNome nao esta cadastrado!\n");
	}
		
	fclose(arq);
}