![]() |
[C] Pointeroperationen in C
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:
Ich habe meine Erklärungen bzw. Fragen mal hinter die jeweiligen Zuweisungen geschrieben und hoffe, dass ihr mir etwas weiterhelfen könnt.
[...]
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 */ [...] } Gruß Lars |
Re: [C] Pointeroperationen in C
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. |
Re: [C] Pointeroperationen in C
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:
(nicht C konform) ausreichend, aber zum debuggen alle mal besser.
cout << &i;
|
Re: [C] Pointeroperationen in C
Zitat:
Zitat:
Zitat:
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++. |
Re: [C] Pointeroperationen in C
Zitat:
Code:
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.
int function(int i)
{ int intarray[i]; [...] } |
Re: [C] Pointeroperationen in C
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:
@0xF30FC7: Das ist tatsächlich grausig. Eine vernünftige Implementation sollte das als int* intarray = malloc(4*i) behandeln. |
Re: [C] Pointeroperationen in C
Zitat:
Edit: Vielleicht solltest du die Frage auch mal ![]() |
Re: [C] Pointeroperationen in C
Doch, Hador hat recht. p[5] = *((int*)((int)p + 5*4))
|
Re: [C] Pointeroperationen in C
Zitat:
|
Re: [C] Pointeroperationen in C
Zitat:
Auch wenn es p+5*sizeof(int) heißen müsste :) Edit: Dax, du warst schneller :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz