Tablica dynamiczna szczególny przypadek

Tablica dynamiczna szczególny przypadek
bartek164
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 534
0

chce sobie zrobić funkcję która stworzy mi tablicę ktora w 1 wierszu bedzie mec 4 bloczki( bloczek czyli 1 zmienna, jedno int), w 2 będą 3 bloczki ... tak jak na rysunku, wykonanym w paint,
i nie wiem czy dobrze robie, ale cos mi tu nie pasuje, do kazdego nastepnego adresu wsk, dodaje odpowednia liczbe bloczkow, ale nie wiem czy dobrze to robie,jeśli nie, to bardzo prosze o powiedzienie jak to zrobić

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

int** aloc(int line)
{
    int** tab;
    int i, j;
    for (i = 0; i < line; ++i) {
        tab[i] = malloc((line - i) * sizeof(int));
    }
    for (i = 0; i < line; ++i)
        for (j = 0; j < line - i; ++j)
            tab[i][j] = 0;

    return tab;
}

int main()
{
    int i, j;
    int line = 4;
    int** wsk = aloc(4);

    for (i = 0; i < line; ++i) {
        puts("\n");
        for (j = 0; j < line - i; ++j) {
            printf("%d,", wsk[i][j]);
        }
    }
    return 0;
}

xx.png

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
0
Kopiuj
int** tab = malloc(line * sizeof(int*));
GS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1265
0
bartek164 napisał(a):
Kopiuj
int** aloc(int line)
{
    int** tab;
    int i, j;
    for (i = 0; i < line; ++i) {
        tab[i] = malloc((line - i) * sizeof(int));
    }
    for (i = 0; i < line; ++i)
        for (j = 0; j < line - i; ++j)
            tab[i][j] = 0;

    return tab;
}
  1. Czemu używasz malloc a nie new?
  2. Nie zdefiniowałeś zadeklarowałeś tablicy, która trzyma tablice dynamiczne, czyli:
Kopiuj
tab = malloc(line*sizeof(int));
for (i = 0; i < line; ++i) {
    tab[i] = malloc((line - i) * sizeof(int));
}
  1. Nie zwalniasz pamięci: użyj free
bartek164
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 534
0
Kopiuj
int** aloc(int line)
{

    int** tab = malloc(1 * sizeof(int));
//int z , tab = &z
    int i, j;
    for (i = 0; i < line; ++i) {
        tab[i] = malloc((line - i) * sizeof(int));
    }
    for (i = 0; i < line; ++i)
        for (j = 0; j < line - i; ++j)
            tab[i][j] = 0;

    return tab;
}

też działa, ale jak to się dzieje, że tab =&z nie działa, znaczy chodzi o to że zamiast 1* sizeof(int) po prostu przypisać jakiś adres int

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1

Twój kod jest błędny. Ma być line * sizeof(int*), czyli tab wskazuje na tablicę line elementów typu int*.

Dlaczego miałoby działać z z? Co z ma do tego? tab ma wskazywać na obszar pamięci zdolny przechowywać (w tym przypadku) 4 wskaźniki typu int*.

bartek164
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 534
0

w jaki sposób jeden sizeof(int) jest w stanie przechowywać 4 sizeof(int), drugi 3, trzeci 2 ..., jak mniemam to w 1 jednym takim bloku muszą się znajdywać wszystkie adresy tych bloczkow, czyli w pierwszym są 4 adresy

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1

Bo tab przechowuje jedynie 4 wskaźniki, a każdy z tych wskaźników może wskazywać na co tylko chce. Właśnie dlatego masz

Kopiuj
for (i = 0; i < line; ++i)
    tab[i] = malloc((line - i) * sizeof(int));

screenshot-20170602165707.png

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.