Zwracanie tablicy wskaźników

0

Próbowałem zrobić program który posortuje i wyświetli kilka stringów. Problem jest w tym że nie mogę poprawnie przekazać tablicy wskaźników z funkcji do main. Pon próbie uruchomienia programu wyskakuje taki błąd:
blad.png
Uprzedzam że jestem mocno początkujący.
Poniżej kod programu(w C):

#include <stdio.h>
#define IloscLAN 3
char** sortuj(char stringi[][50]);

int main(void)
{
	char**string2;
	char stringi[3][50] = { "tabularaza idzie ze mna",
		"aureliusz spotkal barnabe","surdon poszedl do domu" };
	string2 = sortuj(stringi);
	for (int i = 0; i < IloscLAN; i++)
	{
		puts(string2[i]);
	}
}

char** sortuj(char stringi[][50])
{
	char*tablicaA[IloscLAN];
	char *temp;
	for (int i = 0; i < IloscLAN; i++)
	{
		tablicaA[i] = stringi[i];
	}

	for (int i = 0; i < IloscLAN - 1; i++)
	{
		for (int licznik = i + 1; licznik < IloscLAN; licznik++)
		{

			for (int icznik = 0;icznik<50; icznik++)                                  //sortowanie
			{
				if (tablicaA[i][icznik]<tablicaA[licznik][icznik])
				{
					temp = tablicaA[i][icznik];
					tablicaA[i][icznik] = tablicaA[licznik][icznik];
					tablicaA[licznik][icznik] = temp;
					break;
				}
			}
		}                                                                            //sortowanie
	}
	return tablicaA;
}
2

Zwracasz wskaźnik do lokalnej tablicy i potem go używasz. To jest UB.

Zamiast implementować własne sortowanie użyj qsort, szczególnie, że wygląda jakbyś sortował pojedyncze znaki a nie stringi.

0

Aj faktycznie sortuje znaki. No ale mniejsza o to, ja chciałem głównie poćwiczyć te manipulacje wskaźnikami/tablicami. A jakby to wyglądało w kodzie? bo jak próbuje zrobić jakaś lokalna tablice to kompilator twierdzi że to nie jest 1value i wyskakuje błąd :/ Interesuje mnie też czy przy tym przekazywaniu ma zastosowanie typ char** bo miałem co do tego wątpliwości.

1

@Vatrasar
Problem jest taki, że po wykonaniu funkcji "sortuj" nie masz dostępu do tablicaA, bo nie zaalokowałeś miejsca na nią - zatem używasz (niepoprawnie!) miejsca ze stosu i oprócz tego, że masz access violation to możesz równie dobrze nadpisać sobie kiedyś jakieś własne dane.

Jeśli jeszcze nie czytałeś to poczytaj o alokacji pamięci -> funkcje malloc() i calloc() (malloc alokuje obszar pamięci, calloc dodatkowo inicjalizuje go zerami).

W swojej funkcji sortuj zamień:

char* tablicaA[IloscLAN];

na:

char** tablicaA = (char**) malloc(IloscLAN * sizeof(char*));

I masz poprawny dostęp do danych (pomijam algorytm sortowania, który nie działa ;))

Z innych uwag (dotyczących bardziej stylu programowania):

  • Popraw nazewnictwo zmiennych (zamiast tablicaA, mozesz miec TablicaPosortowana, chociaż generalnie polecam używać terminologii angielskiej).
  • Twój main() ma zwracać typ int, tymczasem nie zwraca nic. return 0; na konie i będzie ok.
  • Main() generalnie mógłby przyjmować argc i argv:
int main(int argc, char *argv[])

Chociaż Twoja wersja też jest zgodna z C99: http://c0x.coding-guidelines.com/5.1.2.2.1.html

EDIT: po wszystkim pamięć zaalokowaną przez malloc, trzeba zwolnić - funkcja free().

0

No tak, jeszcze nie doszedłem do tematu alokacji pamięci i stąd problemy. Dziękuje ;)

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