Die Mathe-Redaktion - 19.06.2018 10:53 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
ListenpunktSchwätz / Top 15
ListenpunktWerde Mathe-Millionär!
ListenpunktAnmeldung MPCT Juli
ListenpunktFormeleditor fedgeo
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 607 Gäste und 21 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 

Antworte auf:  C: Zeiger und Speicher von Oggel
Forum:  Programmieren, moderiert von: matph

[Zur Forum-Gliederung] [Wie man Fragen beantwortet]

  Alle registrierten Mitglieder können Mitteilungen schreiben.
Benutzername:
Passwort:
Nachricht-Icon:                     
                    
                  
Nachricht:


 

Erledigt J


Eingabehilfen (JavaScript): [Link extern intern] [MathML?] [$$?]
[fed-Bereich] [LaTeX-inline] [LaTeX-display] [hide-Bereich] [Quelltext [num.]][?]
 Zeige Vorschau      Schreibe im fedgeoFormeleditor oder mit Latex.

Wähle Smilies für Deine Nachricht: :-) :-( :-D ;-) :-0 8-) :-? :-P :-|
Optionen: Deaktiviere HTML in dieser Nachricht
Deaktiviere MATHML in dieser Nachricht. Wenn Dein Text $-Zeichen enthält, die nicht LaTeX-Formeln begrenzen.
Deaktiviere Smilies in dieser Nachricht
Zeige die Signatur (Kann in 'Mein Profil' editiert werden.)
    [Abbrechen]
 
Beachte bitte die [Forumregeln]


Themenübersicht
Oggel
Aktiv
Dabei seit: 29.12.2015
Mitteilungen: 157
Herkunft: Niedersachsen
 Beitrag No.4, eingetragen 2018-01-20 12:47    [Diesen Beitrag zitieren]

Okay danke euch beiden.
Da es eine Klausuraufgabe war, sollte es wahrscheinlich nur zeigen, dass man Pointerarithmetik grundsätzlich verstanden hat.
Danke Wrathchild für die zusätzliche Info :)


darkhelmet
Senior
Dabei seit: 05.03.2007
Mitteilungen: 2345
Herkunft: Bayern
 Beitrag No.3, eingetragen 2018-01-20 00:27    [Diesen Beitrag zitieren]

Indem du in Zeile 2 die 42 an die höchste adresse stellst und nicht an die niedrigste, nimmst du an, dass es sich um eine big-endian Architektur handelt. Es gibt aber auch little-endian Architekturen, insbesondere die Intel- und AMD-Prozessoren, die in handelsüblichen PCs sind.

Sonst ist mir nichts aufgefallen.

[Die Antwort wurde nach Beitrag No.1 begonnen.]


Wrathchild
Senior
Dabei seit: 09.01.2007
Mitteilungen: 782
Herkunft:
 Beitrag No.2, eingetragen 2018-01-20 00:21    [Diesen Beitrag zitieren]

Zur Ergänzung habe ich mal das folgende Programm geschrieben, das im Wesentlichen dem entspricht, was in der Aufgabe steht:

#include <stdlib.h>
#include <stdio.h>
int main() {
  char *p = NULL;
  char c = 'a';
  char a = 'y';
  p = &c;
  *p += 3;
  --p;
  *p = 'x';
  c = *p;
  printf("&a = %p\n&c = %p\na = %c\nc = %c\n", (void*)&a, (void*)&c, a, c);
}

Jetzt kompiliere ich das mit clang test.c und erhalte als Ausgabe
&a = 0x7fff76946776
&c = 0x7fff76946777
a = x
c = x

Man könnte also meinen, alles ist in Butter: a und c liegen hintereinander im Speicher, also müsste doch alles in Butter sein? Ist es aber nicht, wenn man Compileroptimierungen einschaltet. Wenn ich das mit clang -O2 test.c kompiliere, erhalte ich folgende Ausgabe:
&a = 0x7ffe73c69866
&c = 0x7ffe73c69867
a = y
c = x

Es gibt auch Compileroptionen, um genau diese Art von undefiniertem Verhalten zu erkennen. Wenn ich das ganze mit mit clang -fsanitize=address test.c kompiliere, kriege ich folgendes:
=================================================================
==25273==ERROR: AddressSanitizer: stack-buffer-underflow on address 0x7ffe3977589f at pc 0x00000050c6ea bp 0x7ffe39775870 sp 0x7ffe39775868
WRITE of size 1 at 0x7ffe3977589f thread T0
    #0 0x50c6e9  (/tmp/a.out+0x50c6e9)
    #1 0x7f0fae821009  (/lib64/libc.so.6+0x21009)
    #2 0x4196f9  (/tmp/a.out+0x4196f9)
 
Address 0x7ffe3977589f is located in stack of thread T0 at offset 31 in frame
    #0 0x50c4df  (/tmp/a.out+0x50c4df)
 
  This frame has 2 object(s):
    [32, 33) 'c' <== Memory access at offset 31 underflows this variable
    [48, 49) 'a'
HINT: this may be a false positive if your program uses some custom stack unwind mechanism or swapcontext
      (longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-buffer-underflow (/tmp/a.out+0x50c6e9) 


Wrathchild
Senior
Dabei seit: 09.01.2007
Mitteilungen: 782
Herkunft:
 Beitrag No.1, eingetragen 2018-01-19 23:54    [Diesen Beitrag zitieren]

Wenn ich solche Aufgaben sehe, reißt mir die Hutschnur, weil sie nur jemand stellen kann, der C selber nicht versteht mad

Die Aufgabe an sich ist Unfug. Pointerarithmetik funktioniert laut C-Standard nur innerhalb von Objekten (hat nichts mit OOP zu tun, als „Objekt“ bezeichnet man in C einen zusammenhängenden Speicherbereich, der beispielsweise manuell mit malloc oder automatisch durch eine lokale oder statische Variablendeklaration allokiert wurde). Wenn man die Adresse einer Variablen nimmt und dann damit irgendwie herumrechnet, ist das Verhalten nicht durch den C-Standard definiert, und das ist zu vermeiden.

Ich denke aber, dass das, was Du geschrieben hast, das ist, was der Aufgabensteller hören wollte. In diesem Sinne ist deine Lösung wohl „richtig“


Oggel
Aktiv
Dabei seit: 29.12.2015
Mitteilungen: 157
Herkunft: Niedersachsen
 Themenstart: 2018-01-19 22:18    [Diesen Beitrag zitieren]

Hi Leute,

würde gerne wissen, ob ich folgende Aufgabe richtig verstanden habe und richtig gelöst habe?


Hoffe man kann das lesen.

Danke schonmal für die Antworten :)


 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2018 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]