Funkcja zliczajaca iloczyn dwóch zbiorów (cześć wspólna) i jej wykorzystanie w main()

0

czesc napisalem funkcje ktora przyjmuje w argumencie 2 wskazniki i 2 x 'n'. wydaje sie ze funkcja jest napisana dobrze ale kiedy probuje wykorzystac ja w mainie to mam problem. Kod:

 
#include <stdio.h>
#include <stdlib.h>
 
int* fIloczyn(int *tab1, int n, int *tab2, int m)
{
    int *newtab;
    int i;
    int j;
    int licznik = 0;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            if(tab1[i]==tab2[j])
            {
                licznik++;
                newtab=(int*)realloc(newtab,licznik*sizeof(int));
                newtab[licznik-1]=tab1[i];
            }
        }
    }
    //for(i=0;i<licznik;i++) printf("%d ",newtab[i]);
    return newtab;
}
 
int main()
{
    int tablica1[]={1,2,3,4,5};
    int tablica2[]={3,8,10,24,125};
    printf("Zbior A:\n");
    int i;
    for(i=0;i<5;i++) printf("%d  ",tablica1[i]);
    printf("\n\nZbior B:\n");
    for(i=0;i<5;i++) printf("%d  ",tablica2[i]);
    printf("\n\nIloczyn zbioru A i B:\n");
    //int help=sizeof(fIloczyn(tablica1,5,tablica2,5))/sizeof(int);
    int *tablica;
    tablica=(int*)malloc(5*sizeof(int));
    tablica=fIloczyn(tablica1,5,tablica2,5);
    for(i=0;i<5;i++) printf("%d  ",tablica[i]);
 
    system("pause");
    return 0;
} 
0
  1. Nie działa dlatego:
int *newtab;
//
newtab=(int*)realloc(newtab,licznik*sizeof(int));

Pointer to a memory block previously allocated with malloc, calloc or realloc.
Alternatively, this can be a null pointer, in which case a new block is allocated (as if malloc was called).

Skoro pointer nie jest NULLem (a nie jest, bo nic mu nie przypisałes, więc ma losową wartość) to realloc zakłada że masz tam adres zaalokowanego bloku pamieci który chcesz powiększać... A ty masz tam losową wartość! Więc program próbuje powiększy blok pamięci z tego adresu co kończy się wysypaniem.

    tablica=(int*)malloc(5*sizeof(int));
    tablica=fIloczyn(tablica1,5,tablica2,5);

To jest wyciek pamięci. Alokujesz coś a potem tracisz adres tego zaalokowanego bloku przypisując do wskaźnika coś innego.

newtab=(int*)realloc(newtab,licznik*sizeof(int));

to dość ryzykowne bo realloc może nie zadziałać i zwrócić NULLa a ty gubisz tablicę...

0

Dziekuje za odpowiedz. Troche kod zmienilem i dziala ale dalej mam kilka pytan.
w 3. napisales ze uzycie realloc jest ryzykowne? jak mam to rozumiec? uzywac innej funkcji? czy moze uzywac free() do starej tablicy i tworzyc malloc() nowa?

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

int* fIloczyn(int *tab1, int n, int *tab2, int m)
{
	int *newtab;
	int i;
	int j;
	int licznik = 0;
	newtab=(int*)malloc(sizeof(int));
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			if(tab1[i]==tab2[j])
			{
				licznik++;
				newtab=(int*)realloc(newtab,licznik*sizeof(int));
				newtab[licznik-1]=tab1[i];
			}
		}
	}
	return newtab;
}

int main()
{
	int tablica1[]={1,2,3,4,5};
	int tablica2[]={3,8,10,24,125};
	printf("Zbior A:\n");
	int i;
	for(i=0;i<5;i++) printf("%d  ",tablica1[i]);
	printf("\n\nZbior B:\n");
	for(i=0;i<5;i++) printf("%d  ",tablica2[i]);
	printf("\n\nIloczyn zbiorow A i B:\n");
	//int help=sizeof(fIloczyn(tablica1,5,tablica2,5))/sizeof(int);
	int *tablica;
	tablica=fIloczyn(tablica1,sizeof(tablica1)/sizeof(int),tablica2,sizeof(tablica2)/sizeof(int));
	int help = sizeof(tablica)/sizeof(int);
	for(i=0;i<help;i++) printf("%d  ",tablica[i]);
	printf("\n\n");
    system("pause");
    return 0;
}

 

wczesniej w moim kodzie funkcja fIloczyn wykonywala sie dwukrotnie ale wpadlem na pomysl ze mozna ja wykonac i zmiennej help przypisac rozmar zwracanej tablicy przez int. Czy widzisz jeszcze jakies bledy lub masz wskazowki. Bede bardzo wdzieczny.

0
  1. To: sizeof(tablica) na pewno jest źle, bo bierzesz rozmiar WSKAŹNIKA który będzie wynosił zwykle 4. Nie da sie pobrać rozmiaru dynamicznej tablicy, musisz go pamięć i zwracać na przykład przez parametr funkcji.
  2. Ukradli ci dostęp do dokumentacji? Spoko, przepiszę ci, przecież nie mam co robić...

Return Value
A pointer to the reallocated memory block, which may be either the same as ptr or a new location.
The type of this pointer is void*, which can be cast to the desired type of data pointer in order to be dereferenceable.
A null-pointer indicates that the function failed to allocate storage, and thus the block pointed by ptr was not modified.

Więc jeśli realloc nie zadziała to zwróci ci nulla ale nie zmodyfikuje poprzedniego bloku pamięci. Więc poprawnie byłoby zrobić:

nowyPointer = realloc(...);
if(nowyPointer != NULL){
    tablica = nowyPointer;
}else{
//coś nie podziałało ;(
}

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