wie viel speicher wird reserviert? wann strlen und wann sizeof?
-
e) Wie viel Speicher wird im folgenden Teil eines C-Programms für eine 32-Bit CPU
statisch reserviert?struct Person {
int Pers_Nummer;
char Name[20];
struct Person *next;
};
struct Person *p1, p2;int= 4 byte char= 1 byte
struct person *next= 4 byte wegen pointer..also 9 byte..stimmt das?
c) Geben Sie den Wert der Variablen n und m im folgenden C-Programm an.
int n,m;
char *s="Hallo";
n= sizeof(s); m= strlen(s);
Wann wird strlen(s) und wann sizeof(s) verwendet?bei n werden 4 byte ausgegeben weil n ein integer ist oder?
und srlen sind die zeichen des wortes..also 5.sizeof dann wenn man wissen will wie viel speicher benönigt wird
und srlen wenn man wissen möchte wie viele zeichen ein wort besitztlieg ich da richtig?
-
zu e)
Probier es aus.
Denke an das Alignement.Zu c)
bei n werden 4 byte ausgegeben weil n ein integer ist oder?
und srlen sind die zeichen des wortes..also 5.n hat nichts mit der Größe von s zu tun.
strlen liefert die Länge des Strings (also die Anzahl der Zeichen bis zum ersten '\0')
Aber aufpassen:
char t[20] = "Hallo Welt!"; char *s = "Hallo Welt!"; sizeof(t) == 20 sizeof(s) == 4 strlen(t) == 11 strlen(s) == 11
-
Zu 1: In der Struktur ist Name ein Member, der allein schon 20 Byte groß ist. Addiert man nun die Größe eines int (typischerweise 4) und die Größe eines Zeigers (auf 32 Bitsystemen 4 Byte, auf 64 Bitsystemen 8 Byte) hinzu, kommt man auf mindestens 28 Byte.
Der Compiler kann aber noch zusätzliches Padding durchführen, dass heißt, es werden Bytes zwischen die einzelnen Member geschoben. Hier ist es jedoch nicht nötig, wenn Name eine Zeichenkette aus 21 chars wäre, würde der Compiler aber ein solches Padding durchführen.
Deshalb gibt es den sizeof()-Operator, der dir zur Kompilierzeit die Größe von Strukturen bekannt machen kann.Zu 2: Ich seh gerade, DirkB hat schon geantwortet, aber ergänzen möchte ich, dass Strings nullterminiert sind, da bei Funktionsaufrufen die Größe in der aufgerufenen Funktion nicht bekannt ist (z.B. bei strlen oder eigenen Funktionen). Andernfalls müsste man immer die Länge mit übergeben.
-
wie probier ich das denn am besten aus? :S
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[])
{struct Person {
int Pers_Nummer;
char Name[20];
struct Person *next;
};
struct Person *p1, p2;printf("%d bytes",sizeof(Person));
system("PAUSE");
return 0;
}das funktioniert so nicht :S -.- ich bin im 1. semester habe noch nicht sehr viel erfahrung :S
also kommen bei der c diese 4 bytes durch den pointer zu stande? pointer=4byte?
-
struct Person { int Pers_Nummer; char Name[20]; struct Person *next; }; int main() { printf("%d\n",sizeof(struct Person)); return 0; } // oder typedef struct tagPerson { int Pers_Nummer; char Name[20]; struct Person *next; }Person ; int main() { printf("%d\n",sizeof(Person)); return 0; }
Edit: Unterstrich durch "tag" ersetzt.
Und bitte nutze cpp-Tags.
-
perfekt:) kapiert=) dankeschön:)
-
Es gibt unter den Similies so schöne Buttons. Text markieren und Button drücken.
Mit CODE sieht das dan so aus:#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { struct Person { int Pers_Nummer; char Name[20]; struct Person *next; }; struct Person *p1, p2; printf("%d bytes",sizeof(struct Person)); // Person ist etwas anderes als struct Person system("PAUSE"); return 0; }
Ansonsten ist geht nicht wirklich eine üble Fehlerbeschreibung.
Es gibt auch Compiler Fehler und Warnungen. Die solltest du alle beachten und beheben. Wenn du welche nicht verstehst, kannst du gerne fragen.
-
vnecked schrieb:
e) Wie viel Speicher wird im folgenden Teil eines C-Programms für eine 32-Bit CPU
statisch reserviert?Ob die CPU 32-Bit breit ist oder nicht, ist hier irrelevant. Die Bitbreite des Compilers ist entscheidend.
vnecked schrieb:
struct Person {
int Pers_Nummer;
char Name[20];
struct Person *next;
};
struct Person *p1, p2;sizeof(p1)==sizeof(size_t) == o.g. Bitbreite des Compilers / 8
sizeof(p2) ist compileranhängig, also >= sizeof(int)+20+sizeof(size_t)
-
Wutz schrieb:
sizeof(p1)==sizeof(size_t) == o.g. Bitbreite des Compilers / 8
sizeof(p2) ist compileranhängig, also >= sizeof(int)+20+sizeof(size_t)Das ist alles Compiler- und CPU/Architektur-abhänig
Damalstm zu DOS/Windows3-Zeiten war ein size_t 32-Bit, ein Pointer aber je nach Speichermodell 16 oder 32-Bit. Dann ist sizeof(p1)!=sizeof(size_t)
Dies gilt auch noch für einige Mikrocontroller.Einige CPUs wollen ihre Daten auch an ausgerichteten Adressen haben.
Deswegen werden evtl. noch einige Füllbytes eingefügt. (Alignement)
-
DirkB schrieb:
Es gibt unter den Similies so schöne Buttons. Text markieren und Button drücken.
Mit CODE sieht das dan so aus:mit [cpp][/cpp] sieht das noch schöner aus.