TCH (statz) | #1, Főfasz (10466) |
1816 | #42a9 | ^ | Idézet | Mon, 10 Apr 2017 23:23:48 +02 |
94.21.*.* | *.pool.digikabel.hu |
Tehát akkor általános C gyökérség és nem winfos specifikus, értem. Csak azért, mert semmi értelme, simán lehet tudni a méretet előre is. Ha char*, akkor strlen(), ha meg struct, akkor meg sizeof(). Ami meg a pre-alloc-ot illeti, ezek szerint ez a GetAdaptersInfo(info, &size); úgy működik, hogy ha az info == NULL, akkor csak a méretet adja vissza, ha meg nem, akkor meg oda tölti. Hát ezt meg lehet csinálni úgy is, hogy lenne egy GetAdaptersSize() függvény, meg lenne a GetAdaptersInfo(). De kettébontani is felesleges: mégis mi gátolta meg a GetAdaptersInfo() íróját abban, hogy belül foglaljon memóriát? Akkorát amekkorát kell? // mittudomen hogy mukodik, ez most ilyen pseudo-example
void GetAdaptersInfo(IP_ADAPTER_INFO **info, DWORD *size)
{
*size = GetAdaptersCount() * sizeof(struct _IP_ADAPTER_INFO);
*info = malloc(size);
PutAdapters(*info);
} Azaz tudjuk hány darab ilyen struct van, lefoglalunk pont akkora memóriát és oda írjuk őket. Vissza meg egy (struct **) jön, így lehet megoldani a pointerlistákat.Ehhez képest ez kb. most így nézhet ki belül: void GetAdaptersInfo(IP_ADAPTER_INFO *info, DWORD *size) { if (info == NULL) { *size = GetAdaptersCount() * sizeof(struct _IP_ADAPTER_INFO); } else { PutAdapters(info); } }Gondolom belátható, hogy ennek semmi értelme. Akkor is, ha a mikrofos bűne, akkor is, ha bad C practice. De, hogy adjak másik példát, itt a tied, átírva egylépcsősre: char *nev = "Gipsz Jakab"; int kor = 43; int kl = 1; int kor2 = kor / 10; while (kor2 > 0) { ++kl; kor2 /= 10; } int meret = kl + strlen(nev) + 15; char szoveg[meret+1]; snprintf(szoveg, meret+1, "Név: %s Életkor: %d", nev, kor); |