Tablica dynamiczna szczególny przypadek

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ć

#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

0
int** tab = malloc(line * sizeof(int*));
0
bartek164 napisał(a):
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:
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
0
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

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*.

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

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

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

screenshot-20170602165707.png

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