Bład w bibliotece stdio.h podczas wprowadzania danych w konsoli

0

Witam. Mam pewien problem z moim programem, w którym wprowadzam dane osob i następnie wykonuje na nich operacje. A mianowicie cos powoduje, że wyrzuca mi bład w bibliotece stdio.h podczas wprowadzania danych w konsoli.(wpisuje imie i program sie zatrzymuje)

Błąd jest następujący:

Unhandled exception at 0x648F3FDA in 6.4.exe: 0xC0000005: Access violation writing location 0x00EA0FF8.

Kod programu

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


		
#define WLK 40			

struct rekord {
	char imie[WLK];
	char nazwisko[WLK];
	int rok_urodzenia;
	int nr_konta[WLK];
	char nazwa_banku[WLK];
	float srodki;

};


void wyswietlanie(struct rekord * asd,int n);
struct rekord * max(struct rekord * asd, int n);
struct rekord * min(struct rekord * asd, int n);
double suma(struct rekord * asd, int n);
void wprowadz_dane(struct rekord * asd, int n);


int main(void) {


	
	struct rekord *osoba;
	int ilosc_osob=0;
	
	int p = 0;

	osoba = (struct rekord*)malloc(ilosc_osob * sizeof(struct rekord));

	if (osoba == NULL) {
		printf("x\n");
	}
	printf("Podaj liczbe osob ktore chcesz wprowadzic:\n");
	scanf_s(" %i", &ilosc_osob);
	wprowadz_dane(osoba, ilosc_osob);

	printf("Wyswietl wszystkich klientow[1]");
	printf("\nKlient z najwieksza iloscia piniedzy[2]");
	printf("\nKlient z najmniejsza iloscia piniedzy[3]");
	printf("\nSuma[4]\n");

	while (p == 0)
	{
		int w = 10;
		scanf_s("%i", &w);
		fflush(stdin);

		switch (w)
		{
		case 1:
			if (ilosc_osob == 0)
			{
				printf("brak danych do wyswietlenia\n");
			}
			else
			{
				wyswietlanie(osoba, ilosc_osob);
			}
			break;

		case 2:
			if (ilosc_osob == 0)
			{
				printf("brak danych do wyswietlenia\n");
			}
			else
			{
				wyswietlanie(max(osoba, ilosc_osob), 1);
			}
			break;

		case 3:
			if (ilosc_osob == 0)
			{
				printf("brak danych do wyswietlenia\n");
			}
			else
			{
				wyswietlanie(min(osoba, ilosc_osob), 1);
			}
			break;

		case 4:
			if (ilosc_osob == 0)
			{
				printf("brak danych do wyswietlenia\n");
			}
			else
			{
				printf("Suma srodkow: %f PLN\n", suma(osoba, ilosc_osob));
			}
			break;


		case 0: p = 1;
			free(osoba);
			break;

		default: printf("Zly symbol\n");
		}
	}
	
	system("PAUSE");
	return(0);
}



void wyswietlanie(struct rekord * asd, int n) {
	for (int i = 0; i < n ;i++)
	{
		printf("Imie: %s\n", (asd+i)->imie);
		printf("Nazwisko: %s\n", (asd+i)->nazwisko);
		printf("Rok urodzenia: %d\n", (asd+i)->rok_urodzenia);
		printf("Nr. konta: %d\n", (asd+i)->nr_konta);
		printf("Nazwa banku: %s\n", (asd+i)->nazwa_banku);
		printf("Dostepne srodki: %.2lf PLN\n", (asd+i)->srodki);
	}
}


struct rekord * max(struct rekord * asd, int n) {
	int i;
	int a = 0;
	struct rekord * max_asd = 0;

	for (i = 0; i < n; i++) {
		if (asd[a].srodki < asd[i].srodki)
			a = i;
	}

	max_asd = asd + a;
	return (max_asd);
}

struct rekord * min(struct rekord * asd,int n) {
	int i;
	int a = 0;
	struct rekord * max_asd = 0;

	for (i = 0; i < n; i++) {
		if (asd[a].srodki > asd[i].srodki)
			a = i;
	}

	max_asd = asd + a;
	return (max_asd);
}

double suma(struct rekord * asd, int n) {
	double suma = 0;

	for (int i = 0; i < n; i++)
		suma += asd[i].srodki;

	return (suma);
}

void wprowadz_dane(struct rekord *asd, int n) {

	for (int i = 0; i < n; i++)
	{
		printf("\nWprowadz imie : \n");
		scanf_s("%s", (asd + i)->imie);
		fflush(stdin);
		printf("\nWprowadz nazwisko : \n");
		fflush(stdin);
		scanf_s("%s", (asd + i)->nazwisko);
		printf("\nWprowadz rok urodzenia:\n");
		scanf_s("%d", (asd + i)->rok_urodzenia);
		printf("\nWprowadz nr konta:\n");
		scanf_s("%d", (asd + i)->nr_konta);
		printf("\nWprowadz nazwe banku:\n");
		scanf_s("%s", (asd + i)->nazwa_banku);
		printf("\nWprowadz srodki klienta:\n");
		scanf_s("%d", (asd + i)->srodki);
	}
}
0

TL;DR

    int ilosc_osob=0;
 
    int p = 0;
 
    osoba = (struct rekord*)malloc(ilosc_osob * sizeof(struct rekord));

0
vpiotr napisał(a):

TL;DR

    int ilosc_osob=0;
 
    int p = 0;
 
    osoba = (struct rekord*)malloc(ilosc_osob * sizeof(struct rekord));

Mozesz podpowiedziec jak to powinno wygladac?

0

Przeniosłem malloc poniżej scanf_s(" %i", &ilosc_osob); lecz problem nadal występuje. Dorzucam kod raz jeszcze:

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


		
#define WLK 40			

struct rekord {
	char imie[WLK];
	char nazwisko[WLK];
	int rok_urodzenia;
	int nr_konta[WLK];
	char nazwa_banku[WLK];
	float srodki;

};


void wyswietlanie(struct rekord * asd,int n);
struct rekord * max(struct rekord * asd, int n);
struct rekord * min(struct rekord * asd, int n);
double suma(struct rekord * asd, int n);
void wprowadz_dane(struct rekord * asd, int n);


int main(void) {


	
	
	int ilosc_osob;
	int p = 0;
	struct rekord *osoba;
	
	printf("Podaj liczbe osob ktore chcesz wprowadzic:\n");
	scanf_s("%i", &ilosc_osob);
	
	osoba = (struct rekord*)malloc(ilosc_osob * sizeof(struct rekord));
	wprowadz_dane(osoba, ilosc_osob);
	if (osoba == NULL) {
		printf("x\n");
	}

	printf("Wyswietl wszystkich klientow[1]");
	printf("\nKlient z najwieksza iloscia piniedzy[2]");
	printf("\nKlient z najmniejsza iloscia piniedzy[3]");
	printf("\nSuma[4]\n");

	while (p == 0)
	{
		int w = 10;
		scanf_s("%i", &w);
		fflush(stdin);

		switch (w)
		{
		case 1:
			if (ilosc_osob == 0)
			{
				printf("brak danych do wyswietlenia\n");
			}
			else
			{
				wyswietlanie(osoba, ilosc_osob);
			}
			break;

		case 2:
			if (ilosc_osob == 0)
			{
				printf("brak danych do wyswietlenia\n");
			}
			else
			{
				wyswietlanie(max(osoba, ilosc_osob), 1);
			}
			break;

		case 3:
			if (ilosc_osob == 0)
			{
				printf("brak danych do wyswietlenia\n");
			}
			else
			{
				wyswietlanie(min(osoba, ilosc_osob), 1);
			}
			break;

		case 4:
			if (ilosc_osob == 0)
			{
				printf("brak danych do wyswietlenia\n");
			}
			else
			{
				printf("Suma srodkow: %f PLN\n", suma(osoba, ilosc_osob));
			}
			break;


		case 0: p = 1;
			free(osoba);
			break;

		default: printf("Zly symbol\n");
		}
	}
	
	system("PAUSE");
	return(0);
}



void wyswietlanie(struct rekord * asd, int n) {
	for (int i = 0; i < n ;i++)
	{
		printf("Imie: %s\n", (asd+i)->imie);
		printf("Nazwisko: %s\n", (asd+i)->nazwisko);
		printf("Rok urodzenia: %d\n", (asd+i)->rok_urodzenia);
		printf("Nr. konta: %d\n", (asd+i)->nr_konta);
		printf("Nazwa banku: %s\n", (asd+i)->nazwa_banku);
		printf("Dostepne srodki: %.2lf PLN\n", (asd+i)->srodki);
	}
}


struct rekord * max(struct rekord * asd, int n) {
	int i;
	int a = 0;
	struct rekord * max_asd = 0;

	for (i = 0; i < n; i++) {
		if (asd[a].srodki < asd[i].srodki)
			a = i;
	}

	max_asd = asd + a;
	return (max_asd);
}

struct rekord * min(struct rekord * asd,int n) {
	int i;
	int a = 0;
	struct rekord * max_asd = 0;

	for (i = 0; i < n; i++) {
		if (asd[a].srodki > asd[i].srodki)
			a = i;
	}

	max_asd = asd + a;
	return (max_asd);
}

double suma(struct rekord * asd, int n) {
	double suma = 0;

	for (int i = 0; i < n; i++)
		suma += asd[i].srodki;

	return (suma);
}

void wprowadz_dane(struct rekord *asd, int n) {

	for (int i = 0; i < n; i++)
	{
		printf("\nWprowadz imie : \n");
		scanf_s("%s", (asd + i)->imie);
		fflush(stdin);
		printf("\nWprowadz nazwisko : \n");
		fflush(stdin);
		scanf_s("%s", (asd + i)->nazwisko);
		printf("\nWprowadz rok urodzenia:\n");
		scanf_s("%d", (asd + i)->rok_urodzenia);
		printf("\nWprowadz nr konta:\n");
		scanf_s("%d", (asd + i)->nr_konta);
		printf("\nWprowadz nazwe banku:\n");
		scanf_s("%s", (asd + i)->nazwa_banku);
		printf("\nWprowadz srodki klienta:\n");
		scanf_s("%d", (asd + i)->srodki);
	}
}
0

Zweryfikuj jeszcze użyte formattery, bo nie zgadzają się typy danych...

  • nr_konta u Ciebie to tablica intów, a odczytujesz %d
  • srodki to float, a odczytujesz %d

1 użytkowników online, w tym zalogowanych: 0, gości: 1