Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » sizeof Problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
18.11.2005, 11:50 Uhr
~BrettVorDemKopf
Gast


Ich habe ein Problem mit Zeigern. Eigendlich sollte alles funktionieren, nur irgendwie
habe ich gerade ein Brett vor dem Kopf.

Hauptprogramm:

C++:
typedef unsigned char byte;
byte pixmap[512*512*3];



in der Main die Abfrage:

C++:
cout << sizeof(pixmap) << endl;


gibt mir das korrekte Ergebnis 786432 aus.

sobald ich die Grösse des Feldes aber inerhalb einer Funktion abfragen möchte

C++:
void groesse( byte *pixmap ) {
   cout << sizeof(pixmap) << endl;
}


gibt er mir nur 4 aus (deutet für mich darauf hin, dass er nur die Adresse nimmt)

Was kann das Problem sein?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.11.2005, 12:26 Uhr
ao

(Operator)


It's not a bug, it's a feature. Innerhalb von groesse() ist pixmap ein Zeiger, und dessen sizeof ist 4. groesse hat keine Möglichkeit, die wahre Größe des Feldes zu bestimmen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.11.2005, 12:32 Uhr
Pler
Einer von Vielen
(Operator)


und wenn du auf elemente des Felder zugreifen willst, musst du oben auch anders vorgehen, als in der Funktion.

oben:
pixmap[24] = zahl;

in der funktion:
*pixmap[24] = zahl;


..hm...? ja müsst stimmen...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.11.2005, 12:39 Uhr
0xdeadbeef
Gott
(Operator)


Das ist Blödsinn. In der Funktion kannste genau so auf die Elemente zugreifen wie außerhalb auch.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.11.2005, 13:05 Uhr
Pler
Einer von Vielen
(Operator)


ja, das stimmt!
Ich nehme hiermit alles zurück.

Aber vielleicht könnte trotzdem mir mal jemand erklären, warum in der main() die groesse des feldes ausgegeben wird.
Ich hätte ja nun fest damit gerechnet, dass da 4 rauskommt. pixmap selber ist ja immer ein Zeiger.
(Darum kam es überhaupt erst zu dieser Verwirrung oben *kopfschüttel über mich selbst*.)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.11.2005, 13:49 Uhr
ao

(Operator)


Außerhalb der Funktion groesse ist pixmap ein Array der Größe 512 * 512 * 3 * 1 (=> sizeof byte), und so wirds angezeigt.
Innerhalb von groesse gibts eine lokale Variable gleichen Namens, die die Globale überdeckt (Sichtbarkeitsregeln), und deren Größe wird angezeigt.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.11.2005, 00:12 Uhr
Pler
Einer von Vielen
(Operator)


Ja, das das mit - wo welche variable gesehen wird ist schon klar.
Aber ich versteh immer noch nicht, warum die Groeße des Arrays angezeigt wird. Letzenendes ist es ja auch bloß ein zeiger. Und wenn ich einen Normalen Zeiger anlegen würde, und diesen auf das array zeigen lassen würde, würde sizeof() wahrscheinlich auch nicht die größe des arrays liefern. Das gleiche gilt bestimmt auch für zeug was man mitt malloc und co macht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.11.2005, 00:23 Uhr
0xdeadbeef
Gott
(Operator)


Das Array ist eben kein Zeiger, sondern ein Speicherbereich. Es ist bloß implizit in einen Zeiger konvertibel.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.11.2005, 00:38 Uhr
kronos
Quotenfisch
(Operator)


Du kannst das machen:

C++:
void groesse( byte pixmap[512*512*3] ) {
   cout << sizeof(pixmap) << endl;
}


Falls die größe dynamisch ist, musst du sie seperat übergeben.


Bearbeitung:
vermutlich darfst du hier keine arithmetik verwenden

--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 21.11.2005 um 00:39 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.11.2005, 09:59 Uhr
ao

(Operator)



Zitat von Pler:
Aber ich versteh immer noch nicht, warum die Groeße des Arrays angezeigt wird. Letzenendes ist es ja auch bloß ein zeiger.

Nein. Auf diese "Vereinfachung" trifft man leider immer wieder.

Array und Zeiger sind in der Benutzung (Indizierung von Elementen, Übergabe an Funktionen, ...) sehr ähnlich, aber sie sind nicht dasselbe. Ein Array ist ein Stück Speicher, ein Zeiger zeigt auf ein Stück Speicher.

Aus der Verwechslung der beiden resultiert ein erheblicher Teil der C- und C++-Anfängerfehler. Den Unterschied zu kapieren ist IMHO ein sehr wichtiger Schritt für C-Programmierer, weil viele Kurse und Bücher zu sehr auf den Gemeinsamkeiten herumreiten und die feinen Unterschiede vernachlässigen.

Nimm dir mal einen Tag Zeit, mach dir die Unterschiede klar und lass sie dir durchs Hirn sickern. Das wird dich weiterbringen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: