Malloc do tablic w C

0

Witam,
miałbym prośbę o przyjrzenie się kawałkowi mojego kudu. Pierwszy raz próbuję tego - bo muszę zrobić 3 tablice jednowymiarowe o deklarowanym rozmiarze. Korzystam z malloc, ale problem jest w tym że program się potem wiesza.

 
scanf("%d", wymiar);
    
    int *tab1;
    int *tab2;
    int *tab3;
        //Stworzenie dynamicznych tablic N elementowych
     tab1 = (int*) malloc(wymiar);
     tab2 = (int*) malloc(wymiar);
     tab3 = (int*) malloc(wymiar);
     // Wczytanie ręczne parametrów tablicy

Dziękuję z góry i pozdrawiam.

0

Zaalokuj wymiar * sizeof (int) ;) I nie zapomnij potem o zwolnieniu pamięci (free). Podaj przykładową wartość wymiar, dla której się wiesza - może próbujesz zaalokować np 100 GB? ;p Podaj resztę kodu, bo w tym nie widać nic złego.

0

Ale to i tak nic nie zmienia. Poprawiłem. Błąd pojawia się przy alokacji. Bo wiesza sie zanim mi wyświetli kolenje printf.

#include <stdio.h>
//#include <iostream>

//Zmienna globalna wymiar - stała dla wszystkich podfunkcji - dlatego robię ją globalną
int wymiar;

void wczytajTablice(int* a);
void modyfikacjaTablic( int* a,int* p1, int* p2);
void wypiszTablice(int* a);

//#######################################################################
int main(){
    printf("Program do przekształcania tablic.\n Podaj rozmiar tablicy jednowymiarowej:");
    
    scanf("%d", wymiar);
    
    int *tab1;
    int *tab2;
    int *tab3;
        //Stworzenie dynamicznych tablic N elementowych
     tab1 = (int*) malloc(wymiar* sizeof (int));
     tab2 = (int*) malloc(wymiar* sizeof (int));
     tab3 = (int*) malloc(wymiar* sizeof (int));
     // Wczytanie ręczne parametrów tablicy
     printf("/nWczytaj pokoleji wyrazy tablicy A rozdzielająć je klawiszem enter:\n");
     wczytajTablice(tab1);
     printf("/nWczytaj pokoleji wyrazy tablicy B rozdzielająć je klawiszem enter:\n");
     wczytajTablice(tab2);
     printf("/nWczytaj pokoleji wyrazy tablicy C rozdzielająć je klawiszem enter:\n");
     wczytajTablice(tab3);
     
     //Wypisyawnie pierwotnej tablicy
     printf("Pierwotne tablice to:\n");
     printf("\nA= ");
        wypiszTablice(tab1);
     printf("\nB= ");
        wypiszTablice(tab2);
     printf("\nC= ");
        wypiszTablice(tab3);
     
     //Algorytm przypisania tablicy sumy pozostałych
                int *pomocnicza1;
                int *pomocnicza2;
                int *pomocnicza3;
                pomocnicza1 = (int*) calloc(wymiar, sizeof *pomocnicza1);
                pomocnicza2 = (int*) calloc(wymiar, sizeof *pomocnicza2);
                pomocnicza3 = (int*) calloc(wymiar, sizeof *pomocnicza3);
                
      modyfikacjaTablic( pomocnicza1,tab2, tab3);
      modyfikacjaTablic( pomocnicza2,tab1, tab2);
      modyfikacjaTablic( pomocnicza3,tab2, tab1);
     
     //Wypisyawnie przerobionych tablicy
     printf("Tablice powstałe poprzez sume dwóch pozostałych to:\n");
     printf("\nA= ");
        wypiszTablice(pomocnicza1);
     printf("\nB= ");
        wypiszTablice(pomocnicza2);
     printf("\nC= ");
        wypiszTablice(pomocnicza2);
        
        free(tab1);
        free(tab2);
        free(tab3);
        free(pomocnicza1);
        free(pomocnicza2);
        free(pomocnicza3);
     
     
    getchar();
    //System("PAUSE");
    return 0;
}
//######################################################################
void wczytajTablice(int* tablica){
     int n=wymiar;
     int i=0;
     
     for(i;i<n;i++){
                    scanf("%d",(*tablica)+i);
                    }     
     }
     
void wypiszTablice(int* tablica){
     int n=wymiar;
     int i=0;
     
     for(i;i<n;i++){
                    printf("%d ",(*tablica)+i);
                    }     
     }
     
void modyfikacjaTablic( int* a,int* p1, int* p2){
     int n=wymiar;
     int i=0;
         for(i;i<n;i++){
                        *(a+i)=*(p1+i)+*(p2+1);
                        }
     }
 
0

Scanf powinien wyglądać tak:

scanf("%d", &wymiar);
0

Wielkie dzięki. Działa.
A w ogóle po co musi być tam pobranie adresu &?

0
krzysztof91 napisał(a)

Wielkie dzięki. Działa.
A w ogóle po co musi być tam pobranie adresu &?

A jak inaczej ma być? Chcesz przekazać wartość?

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