Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
tbResult MemGetEntry(void* pMemory, tbListEntry<tbMemListEntry>** ppOut) { // Parameter prüfen if(pMemory == NULL) TB_ERROR_NULL_POINTER("pMemory", TB_ERROR); if(ppOut == NULL) TB_ERROR_NULL_POINTER("ppOut", TB_ERROR); // Speicherbereich prüfen if(!tbMemIsValid(pMemory)) return TB_ERROR; // Vom angegebenen Zeiger muss die Größe eines Zeigers auf eine // tbMemListEntry-Struktur abgezogen werden. pMemory = (BYTE*)(pMemory) - sizeof(tbListEntry<tbMemListEntry>*); // pMemory zeigt jetzt auf einen Zeiger auf die zum Speicher // gehörige Listenstruktur - dieser wird geliefert. *ppOut = *((tbListEntry<tbMemListEntry>**)(pMemory)); return TB_OK; } |
- Wozu der cast von void* nach BYTE* ?
- Warum muss die Zeigergröße abgezogen werden, wenn z.B. die Startadresse der Texturliste in pMemory reinkommt? Wird dann nicht auf irgendwas Unbestimmtes vor den eigentlich Daten gezeigt?
- Hätte man statt der letzten (signifikaten) Zeile nicht auch ppOut = (tbListEntry<tbMemListEntry>**)(pMemory) schreiben können bzw. wäre der cast nicht sogar automatisch passiert?
C-/C++-Quelltext |
|
1 2 3 4 |
tbResult tbTextureManager::SetListSize(int iNewSize) tbMemReAlloc(m_pTextureList, iNewSize * sizeof(tbTextureListEntry)) tbMemGetSize(pMemory); MemGetEntry(pMemory, &pMemoryListEntry) |
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
int five = 5; void foo(int* x) { x = &five; } |
C-/C++-Quelltext |
|
1 2 3 4 |
void bar(int x) { x = 5; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
int five = 5; void foo(int*& x) { x = &five; } int main() { int *x = nullptr; foo(x); std::cout << x << std::endl; } |
weil er nur die Adresse des void-Zeigers benutzt und da 4 Byte Zeigergröße draufaddiert
2) Mein Callstack ist:
C-/C++-Quelltext
1 2 3 4 tbResult tbTextureManager::SetListSize(int iNewSize) tbMemReAlloc(m_pTextureList, iNewSize * sizeof(tbTextureListEntry)) tbMemGetSize(pMemory); MemGetEntry(pMemory, &pMemoryListEntry)
und ich seh da keine Zeigermanipulation vorher. In SetListSize wird bei existierende Texturliste deren Startadresse an tbMemReAlloc übergeben und dieser Zeiger in allen weiteren Calls nur durchgereicht.
D.h. also, Adressvariablen sind auch nur Kopien, die nach der Funktion wieder im Nirwana verschwinden? - Interessant, vor allen Dingen wenn man durch Doppelzeiger noch vollends verwirrt wird.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
tbResult MemGetEntry(void* pMemory, tbListEntry<tbMemListEntry>**& ppOut) { //... ppOut = (tbListEntry<tbMemListEntry>**)(pMemory); return TB_OK; } |
Werbeanzeige