Wskaźniki, krzaczki zamiast napisów

0

Hej
Pisze program, którego zadaniem jest wczytywanie napisów do tablicy dynamicznej, a następnie wyświetlenie ich. Niestety, wyświetlanie napisów nie działa, ponieważ poprawnie wyświetla się tylko pierwszy napis, a dalsze to są już krzaczki. Czy może ktoś wskazać gdzie jest błąd? Program nie może korzystać z indeksów, a jedynie z inkrementacji wskaźników.

Pozdrawiam!

#include <stdio.h>

struct Rekord
{
	char Imie[128];
};

main()
{
	int i = 0;
	int ileRekordow = 0;
	char wczytane[128];

	struct Rekord * baza = (struct Rekord*)malloc(sizeof(struct Rekord));
	struct Rekord * ptr = baza;

	while (1)
	{
		scanf("%s", wczytane);

		if (strcmp(wczytane, "0") == 0)
			break;

		ileRekordow++;
		baza = (struct Rekord*)realloc(baza, ileRekordow * sizeof(struct Rekord));

		strcpy(ptr->Imie, wczytane);
		ptr++;
	}

	ptr = baza;
	for (; i < ileRekordow; i++, ptr++)
	{
		printf("%s", ptr->Imie);
	}

	system("Pause");
}
0

Chrzani Waść: http://ideone.com/y8NlmK

4

realloc zmienia adres zalokowanej pamięci, a ptr nadal wskazuje na stary.
http://www.cplusplus.com/reference/cstdlib/realloc/

2
  1. scanf("%s", wczytane); -> buffer overflow jak dostaniesz imie dłuższe niż 127 znaków
  2. strcpy(ptr->Imie, wczytane); -> a na co niby wskazuje teraz twoje ptr? Przecież realloc wcale nie musi rozszerzyć istniejącego miejsca, może je w ogóle zaalokować w innym obszarze sterty. Więc jakikolwiek wskaźnik który miałeś przestaje być poprawny!
  3. Czemu nie używasz po prostu operatora [] po ludzku? Mógłbyś robić po prostu strncpy(baza[ileRekordow++]->Imie, wczytane, 128) (znów potencjalne buffer overflow)
2

tak na szybko:

 
baza = (struct Rekord*)realloc(baza, ileRekordow * sizeof(struct Rekord));
 //tracisz ptr - dokładniej ptr w tym momencie wskazuje pamiec, ktora nie musi należeć do programu
        strcpy(ptr->Imie, wczytane);// pierwsze miejsce na bum
        ptr++;// ustawienie ptr na kolejna pamięć nienależącą do programu
0

@_13th_Dragon - najwidoczniej faktycznie realloc bruździ, a na ideone szczęśliwym trafem nie zmienia pamięci po relalokacji
@ly000 @kaczus - faktycznie, może o to chodzić
@Shalom - chciałbym użyć operatora [], ale takie wymogi zadania, niestety ( ͡° ͜ʖ ͡°) Póki co sprawdzam krótkie napisy, dopisanie ograniczenia to już nie problem.

Zmieniłem nieco pętlę, teraz za każdym razem od nowa przypisuję adres do zmiennej ptr. I już znalazłem błąd w rozumowaniu, dodanie do wskaźnika 10 nie oznacza przesunięcia o 10 bajtów, a przesunięcie o 10-krotność wielkości typu na który wskazuje wskaźnik. Także dziękuje bardzo za pomoc ( ͡° ͜ʖ ͡°)

while (1)
	{
		scanf("%s", wczytane);

		if (strcmp(wczytane, "0") == 0)
			break;

		ileRekordow++;
		baza = (struct Rekord*)realloc(baza, ileRekordow * sizeof(struct Rekord));

		ptr = baza;
		ptr += (ileRekordow - 1);

		strcpy(ptr->Imie, wczytane);
	}
0

@Shalom - zmieniłem scanf na fgets, to będzie bezpieczniejsza opcja :P

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