C Buch

Hallo,

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.

Kennt da jemand was ?

Viele Grüße,
bd3m

Hast du dir schon mal “The C Programming Language” von Richtie und Kernighan angesehen?

Ist zwar das aelteste C Buch, sollte aber immer noch gut genug sein IMHO.

Wie viel Speicher eine Variable belegt etc. ist ein Implementierungsdetail und dann kommt es auf den Compiler, das OS und die Hardware an.

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…? :wink: (Sorry, nicht hilfreich, ich weiß :o )

BTW: Du redest von „DEM“ Debugger - „DEN“ gibt es nicht, es gibt viele (meinst du GDB?).

Redest du von Desktop oder Mikrocontroller?

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.

Moin,

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.

da gilt eher das von @TheDarkRose :

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.

hand, mogel

Ich vermute fast er meint keinen Debugger sonder einen Disassembler.

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.

Hierzu noch ein paar Beispiele:
http://home.fhtw-berlin.de/~junghans/cref/SYNTAX/sizeof.html

*** Edit ***

Sonst steht acuh einiges über die Grenzen(und Dinge die man beachten sollte) der Variablen in diesem Artikel:
http://de.wikibooks.org/wiki/C-Programmierung:_Variablen_und_Konstanten

Dort gibt es auch ienen Grundlegenden Artikel über Zeiger in C:
http://de.wikibooks.org/wiki/C-Programmierung:_Zeiger

OT:
Wollte das eigentlich zu meinem letzten Post hinzufügen, habe aber keine Möglichkeit zum ändern gefunden. Geht das nicht oder bin ich blind?

*** Edit ***

OK wird automatisch drangehangen, damit dann geklärt

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 :smiley:

*** Edit ***

Was haltet ihr denn von diesem Buch ?

Sieht vom Inhaltsverzeichnis gut aus.

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.

mit welcher Programmiersprache?

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.

Hey,

Vielen Dank für alle Antworten. Ich werde “C the programing language” lesen.
Den Roboter werde ich dann in C programmieren.

Gute Wahl.