AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[C] Pointeroperationen in C

Ein Thema von Hador · begonnen am 15. Nov 2008 · letzter Beitrag vom 26. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#1

[C] Pointeroperationen in C

  Alt 15. Nov 2008, 14:09
Hallo zusammen,
ich sitze hier gerade an einer Übung für meinen C-Kurs. Als Aufgabe haben wir ein paar Variablen gegeben und diverse Zuweisungen und sollen mit Begründung sagen warum das ganze nicht funktioniert. Zunächst einmal habe ich das ganze kurzerhand in ein Programm geschrieben und durch den Compiler gejagt um zu sehen, was geht und was nicht. Einiges kann ich mir auch erklären, jedoch sind mir ein paar Stellen noch schleierhaft. In der Hoffung, das sich hier auch ein paar C-Programmierer tummeln:
Code:
[...]
int main(void) {
   int feld[1];
   int i;
   int *p;
   int *p1;
   int *p2;

   p = feld; /* Funktioniert, da feld ein Pointer auf das erste Arrayelement ist und es sich um ein Integerarray handelt */
   /* feld = p; */ /* Funktioniert nicht, da p nicht zwangsläufig auf ein Integerarray zeigt (Aber auf einen int und das wäre ja das selbe, wie ein einelementiges Array, oder?) */

   p = &feld[3]; /* der &-Operator liefert einen Pointer auf das vierte Arrayelement zurück */
   feld[2] = p[5]; /* p[5] liefert den um fünf mal Integergröße veschobenen Pointer zurück */

   p1 = p2 + i; /* Der Zeiger wird um einen Integerwert verschoben */
   p1 = i + p2; /* Auch hier wird der Zeiger verschoben */

   /* Bei folgenden Zuweisungen bin ich mir recht unsicher: */
   /* i = p1 * p2; */ /* Funktioniert nicht, da der *-Operator nicht für zwei Pointer definiert ist */
   i = p1 - p2; /* Wieso ist - denn für zwei Pointer definiert? */
   /* i = p1 + p2; */ /* Funktioniert nicht, da der *-Operator nicht für zwei Pointer definiert ist */

   [...]
}
Ich habe meine Erklärungen bzw. Fragen mal hinter die jeweiligen Zuweisungen geschrieben und hoffe, dass ihr mir etwas weiterhelfen könnt.

Gruß Lars
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 14:33
Ich vermute, dass der C-Compiler ein int[1] als statisches Array implementiert, d.h. auf dem Stack ablegt. Um zu dynamischen Arrays, also int[], kompatibel zu bleiben, erlaubt er p = feld weiterhin und interpretiert es als Abkürzung für p = &feld[0]. feld = p funktioniert aber nicht, weil feld als statisches Array eine feste Adresse hat. Dies ist jedoch nur Spekulation! Ich habe es nicht getestet.

Das es einen "int operator-(void*, void*)" gibt, ist absolut sinnvoll. Er dient dazu, den Abstand zwischen zwei Adressen herauszufinden. Das ist beispielsweise nützlich, um einen Jump-Offset zu berechnen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg

Registriert seit: 1. Jul 2007
155 Beiträge
 
#3

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 14:36
Werte in C nicht zu initialisieren kann tödlich sein. Außerdem sollte man beachten, wie man seine Variablen alloziiert. Heap und Stack sagen dir etwas? Zudem kann man Variablen auch in der Versenkung verschwinden lassen, wenn man einfach deren Adressen überschreibt. Lass dir zur Sicherheit deren Werte und Adressen anzeigen. Mit sprintf() müsste es in C funktionieren, aber ich denke du verwendest eh einen C++ Compiler von daher ist ein einfaches
Code:
cout << &i;
(nicht C konform) ausreichend, aber zum debuggen alle mal besser.
Ich bin ja quasi die perfekte Mischung aus jung, aber sehr erfahren.
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 14:50
Zitat von Apollonius:
Ich vermute, dass der C-Compiler ein int[1] als statisches Array implementiert, d.h. auf dem Stack ablegt. Um zu dynamischen Arrays, also int[], kompatibel zu bleiben, erlaubt er p = feld weiterhin und interpretiert es als Abkürzung für p = &feld[0]. feld = p funktioniert aber nicht, weil feld als statisches Array eine feste Adresse hat. Dies ist jedoch nur Spekulation! Ich habe es nicht getestet.
Dynamische Arrays gibt es im C90 nur insoweit, dass man etwas sowas schreiben kann: int[] = {1, 2, 3}. Wirklich dynamisch ist das nicht. Aber ich werde da mal ein wenig weiterprobieren.
Zitat von Apollonius:
Das es einen "int operator-(void*, void*)" gibt, ist absolut sinnvoll. Er dient dazu, den Abstand zwischen zwei Adressen herauszufinden. Das ist beispielsweise nützlich, um einen Jump-Offset zu berechnen.
Jo, ergibt Sinn, daran hatte ich nicht gedacht.

Zitat von bigg:
Werte in C nicht zu initialisieren kann tödlich sein. Außerdem sollte man beachten, wie man seine Variablen alloziiert. Heap und Stack sagen dir etwas? Zudem kann man Variablen auch in der Versenkung verschwinden lassen, wenn man einfach deren Adressen überschreibt. Lass dir zur Sicherheit deren Werte und Adressen anzeigen. Mit sprintf() müsste es in C funktionieren, aber ich denke du verwendest eh einen C++ Compiler von daher ist ein einfaches
Code:
cout << &i;
(nicht C konform), aber zum debuggen alle mal besser.
Es geht nicht um ein reales Programm, sondern eine Übung und damit um die Frage, welche Zuweisungen warum funktionieren. Ansonsten werden natürlich Variablen initialisiert
Mit sprintf() kann man in Strings herumschreiben. Was du vermtulich meinst ist einfach printf().
Übrigends wird strikt bach ISO C90 gecoded. Da ist nix mit C++.
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#5

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 14:59
Zitat von Hador:
Zitat von Apollonius:
Ich vermute, dass der C-Compiler ein int[1] als statisches Array implementiert, d.h. auf dem Stack ablegt. Um zu dynamischen Arrays, also int[], kompatibel zu bleiben, erlaubt er p = feld weiterhin und interpretiert es als Abkürzung für p = &feld[0]. feld = p funktioniert aber nicht, weil feld als statisches Array eine feste Adresse hat. Dies ist jedoch nur Spekulation! Ich habe es nicht getestet.
Dynamische Arrays gibt es im C90 nur insoweit, dass man etwas sowas schreiben kann: int[] = {1, 2, 3}. Wirklich dynamisch ist das nicht. Aber ich werde da mal ein wenig weiterprobieren.
In C99 waren die Leute die die Spec verfasst haben auf Drogen und erlauben dynamische Arrays auf dem Stack. Also z.B. sowas hier:
Code:
int function(int i)
{
  int intarray[i];
  [...]
}
Der erzeugte Code gleicht in fast allen Fällen einem alloca, wobei alloca in fast allen Implementierungen (der Microsoft Compiler ist da die einzige mir bekannte Ausnahme) schlecht implementiert ist (eine einfache Stack Pointer Modifikation ohne irgendwelche Checks). Wenn Du es schaffst i von aussen zu beeinflussen, hast Du als "Angreifer" also volle Kontrolle über den Stackpointer und das ist im Normalfall keine sonderlich gute Idee.
Fridolin Walther
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 15:11
Da bin ich tatsächlich von C++ und Java ausgegangen, in denen man ein int[] ohne Initialisierungsliste deklarieren kann. Insofern erübrigt sich in C die Unterscheidung statisches/dynamisches Array.

Zitat:
Code:
p1 = p2 + i; /* Der Zeiger wird um einen Integerwert verschoben */
Soweit ich weiß, heißt das nicht p1 = (void*)((int)p2 + i), sondern p1 = (void*)((int)p2 + 4*i).

@0xF30FC7: Das ist tatsächlich grausig. Eine vernünftige Implementation sollte das als int* intarray = malloc(4*i) behandeln.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#7

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 16:23
Zitat von Hador:
Code:
   feld[2] = p[5]; /* p[5] liefert den um fünf mal Integergröße veschobenen Pointer zurück */
Ähm nicht ganz p[5] liefert das Feldelement mit dem Index 5, also das 6te Element zurück, allerdings ist der Ausdruck falsch, wenn auch syntaktisch richtig. feld[2] -> hier kann es dier ganz schnell mal ne AV raushauen, schau dir mal die Definition von feld an.

Edit: Vielleicht solltest du die Frage auch mal im CPP-Forum stellen, dort tummeln sich die C/C++ Experten
Gruß, Jan
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 16:29
Doch, Hador hat recht. p[5] = *((int*)((int)p + 5*4))
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#9

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 16:38
Zitat von Apollonius:
Doch, Hador hat recht. p[5] = (p + 5*4)*
Das ist doch "Element an Stelle 6"? Verschoben um 5 ints wäre doch p + 20..?
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#10

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 16:38
Zitat von Apollonius:
Doch, Hador hat recht. p[5] = (p + 5*4)*
Und der letzte Stern?

Auch wenn es p+5*sizeof(int) heißen müsste

Edit: Dax, du warst schneller
Gruß, Jan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz