Alokacja pamięci typu int**

0

Witam, chcę stworzyć macierz i zalokować pamięć na macierz typu int**, tylko nie za bardzo wiem jak się za to zabrać, bo próbując zalokować jak na zwykły wskaźnik nie udaje się.

5

Alokujesz pamięć na wskaźniki na rzędy (albo kolumny, zależy jak na to patrzysz):

int** ptr = malloc(sizeof(int*) * num_rows);

potem dla każdego rzędu (lub kolumny) alokujesz pamięć na dane:

for(int i = 0; i < num_rows; i++)
    ptr[i] = malloc(sizeof(int) * num_cols);
1
#include <stdio.h>
#include <stdlib.h>

int main()
{

    size_t size = 10, i = 0, j = 0;
    int **array = malloc(size * sizeof(int*));
    for(;i < size; ++i)
    {
        array[i] = malloc(size * sizeof(int));
        for(j = 0;j < size; ++j)
        {
            array[i][j] = i;
            printf("%d ", array[i][j]);
        }
        printf("\n");
        free(array[i]);
    }
    free(array);
    return 0;
}
0

Rozumiem już, dzięki. Teraz jednak mam problem z wpisaniem lub wypisaniem tych liczb do tablicy, ogólnie liczby wczytywane są z pliku .txt i potem chcę je wpisać do tablicy. Dla sprawdzenia wypisuję pierw z pliku a potem z tej nowej tablicy ale coś nie wychodzi, bo na każdej pozycji wypisywany jest ostatni element macierzy z pliku .txt . Tak wygląda po uruchomieniu :user image A tak kod i nie mogę znaleźć w czym jest błąd czy we wpisie czy wypisaniu:

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

int read();
int main()
{
    read();
    return 0;
}

int read()
{

    FILE* f;
    int liczba, i, j, size;

    f = fopen("matrix.txt", "r");
    if (f == NULL) {
        printf("Blad otwarcia pliku liczby.txt\n");
        return 1;
    }

    printf("Pomyslnie wczytano macierz\n");
    fscanf(f, "%d", &size);
    printf("Rozmiar tablicy to: %d\n", size);

    int** matrix;

    matrix = malloc(size * sizeof(int*));
    for (i = 0; i < size; i++) {
        matrix[i] = malloc(size * sizeof(int));
    }

    printf("Sizeof matrix: %i \n", sizeof(matrix));

    for (; feof(f) == 0;) {
        for (i = 0; i < size; i++) {
            for (j = 0; j < size; j++) {
                fscanf(f, "%i", &liczba);
                matrix[i][j] = liczba;
                printf("%i\t", liczba);
            }
            printf("\n");
        }
    }
    printf("Macierz zostala wypelniona: \n");
    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            printf("%i\t", matrix[i][j] = liczba);
        }
        printf("\n");
    }

    fclose(f);
}
3

Wczytujesz poprawnie, natomiast to wypisywanie jest skopane:

printf("%i\t", matrix[i][j] = liczba);

Wypisujesz ostatnia wczytaną liczbę dodatkowo nadpisując całą macierz nią.

Popraw na:

printf("%i\t", matrix[i][j]);

Dodatkowo na końcu programu musisz zwolnić pamięć, każdemu mallocowi powinna odpowiadać inwokacja free, np:

for(int i = 0; i < size; i++) {
    free(matrix[i]);
}
free(matrix);
2

I tego int' w read bez sensu zwracasz, bo... niczego nie zwracasz i masz UB. Zrób void. I w ogóle wypadałoby to podzielić na mniejsze funkcje, bo teraz masz taką jedną boską metodę, która robi wszystko.

0

Rzeczywiście, to matrix [i][j] skopiowałem pewnie z wpisywania, a o zwolnieniu pamiętam tylko piszę po mału i częściami.

No z tym intem to fakt, na początku funkcja miała robić coś innego i zapomniałem zmienić. A z tymi funkcjami to jest to tylko wczytanie i stworzenie tablicy, nowe funkcje miałem zamiar robić dopiero na dodawanie/liczenie wyznacznika itp.

Dzięki za pomoc.

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