Zadanie z Symfonii C++ - wskaźniki

0

Cześć! Zadanie:

Napisz funkcję, która zarezerwuje 10 elementową tablicę, a jej adres przekaże wskaźnikowi o nazwie linijka. Ma to być tablica, w której można przechowywać wskaźniki do tablic znaków.
Następnie za pomocą pętli for dla każdego z 10 elementów tej tablicy linijka:

  • zarezerwuj operatorem new tablicę 80 znaków
  • jej adres wpisz do kolejnego elementu tablicy linijka.
  • w tej 80 znakowej tablicy znaków umieść C-string "to jest linijka nr n" - gdzie n jest kolejnym numerem linijki (0-9).
    Po zrobieniu tego wobec wszystkich 10 elementów tablicy linijka za pomocą pętli for wypisz na ekranie kolejno zawartość tych C-stringów.

Kod:

#include <iostream>
#include <cstdlib>
using namespace std;

char **rezerwacja()
{
	return new char *[10];
}

char *wpisanie(char t[], int liczba)
{
	int i = 0;
	while (t[i++]);
	t[--i] = static_cast<char>(static_cast<int>('0') + liczba);
	return t;
}

int main()
{
	char tablica[80] = "to jest linijka nr ";	
	char **linijka = rezerwacja();

	for (int i = 0; i < 10; ++i)
	{
		linijka[i] = new char[80];
		linijka[i] = wpisanie(tablica, i);
	}
	for (int i = 0; i < 10; ++i)
		cout << linijka[i] << endl;
	
	delete[] linijka;
	system("pause");
}
 

Problem w tym, że wypisuje "to jest linijka nr 0123456789" dla każdego elementu. Gdzie jest błąd? :)

0

Ale ten twój kod nie ma nic wspólnego z zadaniem. Albo bardzo niewiele...
1.

linijka[i] = wpisanie(tablica, i);

W ten sposób NA PEWNO zrobisz wyciek pamięci. Bo linijka[i] to wskaźnik do tablicy gdzie masz coś wpisać. Przypisujesz do niego teraz NOWĄ WARTOŚĆ którą zwróci ci funkcja. A do funkcji nie przekazujesz linijka[i] więc zgubisz wskaźnik do tej zaalokowanej pamięci! Po co w ogóle robisz takie przypisanie? Nie możesz przekazać do funkcji wskaźnika linijka[i]?
2. Cała ta funkcja wpisanie nie ma sensu. Szczególnie że nie użyłeś żadnego strcpy() a powinieneś.
3. Nie zwalniasz pamięci przydzielonej dla kolejnych linijek. I dobrze, bo wysypałoby to program bo przecież przypisujesz do nich inny wskaźnik
4. Błąd o który pytasz wynika z tego że nie rozumiesz co robisz. Dopisałes sobie do statycznej tablicy:
char tablica[80] = "to jest linijka nr "; na końcu liczbę liczba
Ale każde kolejne wywołanie tej funkcji działa na tej samej statycznej tablicy, więc każde kolejne wywołanie funkcji dopisze kolejną liczbę na koniec.

#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;

char **rezerwacja()
{
    return new char *[10];
}

void wpisanie(char* linijka, int liczba)
{
    sprintf(linijka, "%s %d","to jest linijka numer ", liczba);
}

int main()
{
    char **linijka = rezerwacja();
    for (int i = 0; i < 10; ++i)
    {
        linijka[i] = new char[80];
        wpisanie(linijka[i], i);
    }
    for (int i = 0; i < 10; ++i)
        cout << linijka[i] << endl;

    for (int i = 0; i < 10; ++i)
        delete linijka[i];
    delete[] linijka;
}
0

Ok, dzięki. Muszę to przemyśleć na spokojnie, bo jeszcze mieszają mi się te wskaźniki.

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