Wpis z mikrobloga

na dysku


@okpaj: w pamięci

Nie powinienem użyć operatora new albo malloca?

@damienbudzik: Powinieneś. Albo jak c++ std::vector.


@Marcin648: nie pisałem nic w cpp od wieków, ale przeciez malloca używa się do "inicjalizacji" wskaźników, a nie zmiennych automatycznych na stosie
  • Odpowiedz
@Marcin648: @damienbudzik: To jest poprawny kod C, tablica o dynamicznie ustalanej wielkości to VLA (Variable-Length Array). W C++ tego nie ma, ale domyślnie gcc (i chyba clang) kompilują w pseudostandardzie gnu++, który takie rzeczy dodaje. Jak do linii wywołania dodasz -std=c++14 to się nie skompiluje.
  • Odpowiedz
@KrzaQ2: @pilot1123: Szczerze mówiąc to ja nie do końca jeszcze rozumiem dlaczego powyższe działa i się kompiluje i byłbym wdzięczny za rozjaśnienie.
Biorę najpierw oryginalny kod OPa i kompiluję go jako program C:
gcc prog.c -Wall -o prog
Jedyny warning jaki dostaję dotyczy nieużywanej zmiennej tab. Errorów brak.
Skąd kompilator wie ile pamięci zarezerwować dla tablicy int tab[x][y] skoro jej rozmiar na etapie kompilacji nie jest znany?

Ten sam program
  • Odpowiedz
@Malchos: Co to za kompilator?

Kompilator widzi, że nie zna wielkości tablicy, więc generuje kod dla tablicy o tablicy o dynamicznej wielkości. sizeof takiej tablicy nie jest np. stałą kompilacji.

Jeśli chodzi o C++, to, heh bez -pedantic-errors gcc nie daje błędów :/ (a z samym -pedantic jest warning).
  • Odpowiedz
Co to za kompilator?


@KrzaQ2: gcc version 5.4.0 20160609 na Ubuntu.

Czyli jak rozumiem kompilator traktuje powyższy fragment jakoby tam zachodziła dynamiczna alokacja pamięci, ale w żaden sposób o tym nie poinformuje?
W przypadku g++ flaga -pedantic-errors faktycznie załatwia sprawę, ale gcc przynajmniej w mojej wersji dalej nie widzi problemu
  • Odpowiedz
@Malchos: tak jak pisałem, to jest w pełni poprawny standardowy C, więc gcc nie powinien narzekać (ew, może z flagą -std=c89).

Standard C nie definiuje jak ma być alokowane VLA, więc raczej spodziewałbym się (i tak pokazuje fragment z compiler explorera) że będzie to alokacja na stosie, tak jak byś użył alloca
  • Odpowiedz
@KrzaQ2: Ok, już rozumiem, jakoś wcześniej umknęła mi instancja VLA i zasada ich działania, stąd mój brak zrozumienia tego fragmentu kodu. No i weszło to w C99 stąd dla flagi -std=c89 jest błąd tak jak wspomniałeś.
Dzięki za czas i wyjaśnienie ;)
  • Odpowiedz