Tablice dwuwymiarowe C wpisane w void

0

Witam mam szybkie pytanie dlaczego ten kod działa

void losowanie(int *tab)
{
    for(int i=0;i<5;i++)
    {
        tab[i] = 4;
    }
}
int main()
{
    int tab[5];
    losowanie(tab);
    printf("%d",tab[0]);
}

ale ten już się wywala


void losowanie(int **tab)
{
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            tab[i][j] = 4;
        }
    }
}
int main()
{
    int tab[5][5];
    losowanie(tab);
    printf("%d",tab[0][0]);
}

Dzięki wielkie za pomoc

1

Kompilator mówi co się dzieje:

neew1.c:16:15: error: passing argument 1 of ‘losowanie’ from incompatible pointer type [-Werror=incompatible-pointer-types]
   16 |     losowanie(tab);
      |               ^~~
      |               |
      |               int (*)[5]
neew1.c:3:22: note: expected ‘int **’ but argument is of type ‘int (*)[5]’
    3 | void losowanie(int **tab)
      |                ~~~~~~^~~

Masz Type Error i seagfault.

0

Dla mnie to drugie się nie kompiluje. Ale to działa, tylko nie to chciałeś zapewne napisać lol :

#include <stdio.h>

void losowanie(int **tab)
{
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            tab[i][j] = 4;
        }
    }
}
int main()
{
    int t1[5];
    int t2[5];
    int t3[5];
    int t4[5];
    int t5[5];
    
    int* tab[5] = {t1, t2, t3, t4, t5};
    losowanie(tab);
    printf("%d",tab[0][0]);
}

https://godbolt.org/z/c4zz68doT

Pomyliłeś jednowymiarową tablicę wskaźników do jednowymiarowych tablic intów z tablicą dwuwymiarową intów (która tak naprawdę jest int*).
Takie problemy to straszny ból na początku nauki;

edit: ale to i tak nie powinno działać, bo tab[0][0] wskazuje na pierwszy wskaźnik? Kurcze , sam nie rozumiem...

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