momentan habe ich Interesse an der Programmiersprache C gefunden.
Nun such ich ein etwas spezielleres Buch, es sollte:
-C gut erklären, Anfänger Sachen kann es ruhig weglassen, da ich in Java relativ geübt bin
-Vor allem auf die Speicheradressen eingehen. Also in welches Register wird was gespeichert,
eventuell Beispiel und Erklärungen zu Pufferüberläufen.
-Den Debugger miteinbeziehen
Die meisten Bücher erklären ja nur C. Habe zumindest noch keins gefunden,
welches angibt wie groß ein bestimmtes Integer-Array ist und wo es hin gepsiechert wird usw.
Einfach eine Schicht tiefer als andere Bücher.
Ja, also spätestens bei Registern würde ich auch vermuten, dass das in einem „normalen“ C-Buch nicht vorkommt - vielleicht geht einem ein Licht auf, wenn man
ein Buch über C-Programmierung
ein Buch über Assembler und
ein Buch über Compilerbau
parallel liest…? (Sorry, nicht hilfreich, ich weiß :o )
BTW: Du redest von „DEM“ Debugger - „DEN“ gibt es nicht, es gibt viele (meinst du GDB?).
Jon Erickson No Starch Press - Hacking - The Art of Exploitation (2te Auflage)
Außerdem:
Wiley - Reversing - Secrets of Reverse Engineering
Allerdings gehen beide Bücher recht tief in Reverse Engineering rein. Es gibt auch ein paar gute Tuts auf Codeproject zu dem Thema. Einfach mal auf deren Seite unter C / Assembler Rubrik schauen.
Kernigham & Ritchi wurde ja schon empfohlen. Ein Buch von den Erfindern von C soll ja nicht so schlecht sein. Ich würde aber eher zu C++ statt C tendieren, da Du mit C++ ebenfalls den gleichen Blödsinn veranstalten kannst wie mit C. Zusätzliczh hast Du noch Vererbung und weiteren schöne Sachen. Nimm lieber die Bibel von Stroustrup (gut K&R kann nicht schaden).
nein - auch Anfängersachen sind bei dem Thema wichtig. Wärend Du bei Java regelrecht in Watte eingepackt wirst, konfrontiert Dich C direkt mit der harten Realität der CPU.
das was Du wissen willst ist 110% vom Prozessor abhängig. Beim Desktop kommst Du gar nicht so weit runter, außer Du beginnst Treiber zu programmieren (wobei ich glaube das da Windows auch einiges noch abschirmt). Bis Du aber soweit runter gehen kannst, wirst Du noch ernsthaft C üben dürfen. Und jeder Microcontroler ist anders. Außerdem sind einige Techniken vom Desktop nicht für µC geeignet (da fehlt z.B. eine MMU etc.)
Das ist nicht mehr C relevant. Da ist eher wichtig wie die Techniken funktionieren. Und das ist wiederum davon Abhängig mit welchem Compiler die Programme übersetzt werden. Alleine der Aufbau des Stack ist abhängig davon was der Compiler macht.
das Thema ist von der IDE abhängig die Du nutzt
[quote=bd3m;79265]Die meisten Bücher erklären ja nur C. Habe zumindest noch keins gefunden,
welches angibt wie groß ein bestimmtes Integer-Array ist und wo es hin gepsiechert wird usw.[/quote]
In C gibt es keine Größenangabe für ein Array - Du musst wissen wie groß das Array ist. Weist Du es nicht, kannst sonst was passieren. Wenn Du wissen willst wo es gespeichert wird:
int *array = new int[40];
printf("Adresse: %i", *array);
Aber wozu willst Du das wissen? Das selber ist uninteressant. Wichtig ist das das Array gültig ist und Dir new nicht NULL zurückliefert.
Einfach eine Schicht tiefer als andere Bücher.
Das lernst Du nicht aus C oder C++ Büchern. Was eine Schicht unter C/C++ passiert ist das gleiche wie unter Delphi, R und wie die Sprachen alle heißen. Das ist auch das gleiche was unterhalb der Java VM (nach dem JIT) passiert. Da brauchst Du aber andere Bücher.
Um Zur Laufzeit festzustellen wie viel Speicher eine Sorte von Variablen braucht gibt es die sizeof() methode, soweit ich weiss. sizeof(int);
Die Größe eines Arrays bekommst du dann durch die Anzahl der Elemente in diesem Array, da du ja weisst wie groß ein Elemnt ist.
sizeof() auf ein Array anzuwenden klappt glaube ich nicht, da du dann die Größe des Zeigers auf das erste Element des Arrays bekommst und nicht die Größe des Arrays. Kann es aber grade nicht ausprobieren.
Hey,
vielen lieben Dank für die ganzen Antworten . Ich muss vielleicht noch ein paar Eckdaten hinzufügen:
Ich studiere Informatik an einer Uni, nur lernen wir außer Java keine andere Programmiersprache. Ich wollte aber schon immer gern
C lernen. Aber halt nicht nur C sondern auch das drum herum. Eben mit den Registern, Speicheradressen.
Was passiert wenn man eine Speicheradresse überschreibt …
Die „Normale“ Programmierung interessiert mich eher weniger. Eher dieses Buch (das erste):
[QUOTE=Prototype]Was ich zu dem Thema empfehlen kann:
Jon Erickson No Starch Press - Hacking - The Art of Exploitation (2te Auflage)
Außerdem:
Wiley - Reversing - Secrets of Reverse Engineering
Allerdings gehen beide Bücher recht tief in Reverse Engineering rein. Es gibt auch ein paar gute Tuts auf Codeproject zu dem Thema. Einfach mal auf deren Seite unter C / Assembler Rubrik schauen.[/QUOTE]
Habe ich sogar hier daheim. Allerdings bin ich relativ weit weg davon zu sagen, dass ich C kann…
Die Spielchen mit den Register,Debugger, als auch das Anwendungsfeld waren super, super interessant.
Allerdings schreibt er halt nur ein paar, für das Buch nützliche, Beispiele…
Ach ja C will ich auf DesktopComputer programmieren.
@mogel :
Was sind denn die Vorteile von C++ zu C ?
Achja: Der 2. Grund um C oder C++ zu lernen ist, dass ich zu Weihnachten einen kleinen
programmierbaren Roboter bekomme
Handbuch der CPU bzw. des Boards lesen. Das kann Dir keiner sagen.
z.B. OOP oder Templates. C++ ist eine Verbesserung von C. Für mich persönlich: warum soll ich ein altes Auto fahren, wenn das Neue fast die gleichen Features hat und noch ein paar Extras.
Interessant wäre zu wissen welcher Prozessorarchitektur dein kleiner Roboter hat. Über x86 bzw x64 gibts sehr sehr viel gutes Material. Andere Architekturen kenne ich persönlich nicht. Ansonsten erklärt jedes gute Assembler Tutorial sehr ausführlich Register und ihren Zweck.
Zum Thema C / C++:
Ich persönlich finde C++ sehr überladen und mag diese Sprache nicht besonders. Vielleicht bin ich da nur sehr verwöhnt von Java. Wenn ich etwas auf sehr lowen Level schreibe nutze ich dafür eigentlich nur C und die API vom jeweiligen OS. Ansonsten bin ich mit Java bestens bedient. Kann aber auch daran liegen das ich nie “größere Projekte” in C umsetze.