Wie führen Sie eine Iteration durch Zeiger?
Beispiel:
int *start;
start = (int*)malloc(40);
Wenn ich wollte, Durchlaufen alle 40 bytes, wie würde ich tun?
Ich versuchte dabei so etwas wie:
while(start != NULL){
start++;
}
aber, dass durchläuft eine massive Anzahl von Werten, die viel größer ist als 40. So, wie Sie sicherstellen, dass Sie Durchlaufen alle 40 Byte.
Dank für all die Hilfe.
- Ich sehe nicht ein, Grund für das down-voting die Frage, gibt es vernünftige input und Aufwand, der zeigt, was der OP machen will. Was passiert SO in letzter Zeit
- Ich kann mich nicht erinnern, das Grundprinzip, aber sehen Sie es SO. Sie sollten nie gegossen, das Ergebnis von malloc. Entfernen Sie die (int *) from line start=...malloc... ;
- Es muss gelehrt werden, anstatt still downvoted. Grund dafür ist im detail in der anderen Frage SO, aber es ist, dass das casting malloc den Rückgabewert kann MÖGLICHERWEISE ausblenden/tamper eine fehlgeschlagene Zuweisung. Beachten Sie, dass dies spezifisch für C. In C++, es ist eine Anforderung, dies zu tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es hier zwei Probleme.
Einem einzigen ptr++ überspringt so viele bytes, wie die Art des Elements es Punkte zu.
Hier der Typ ist int, so würde es überspringen 4 bytes jedes mal, wenn (bei einer 32 bit-Maschine, da integer ist 4 bytes (32 bits) dort).
Wenn Sie möchten, Durchlaufen alle 40 bytes (ein byte zu einem Zeitpunkt), die Iteration mit sagen ein char-Datentyp (oder type-cast Ihr int* char* und dann erhöht)
Das andere problem ist die Schleife Kündigung.
Niemand da ist, setzen Sie eine NULL am Ende, also deine Schleife würde immer weiter laufen (und Zeiger auf dem Vormarsch), bis es läuft in kann eine null oder aus Ihrem zugewiesenen Speicherbereich und stürzt ab. Das Verhalten ist undefiniert,.
Wenn Sie reserviert 40 Byte, Sie zu kündigen, bei 40 bytes selbst.
Update:
Basierend auf einen Kommentar, cum down-Abstimmung auf die ursprüngliche Frage, ist es erwähnenswert, dass die Typumwandlung das Ergebnis von malloc ist nicht eine gute Idee in C. Der primäre Grund dafür ist, dass es könnte möglicherweise manipulieren eine fehlgeschlagene Zuweisung. Es ist eine Anforderung in C++, obwohl. Die details finden Sie in der exakt gleichen Frage auf SO. Suche nach "casting-Rückgabewert von malloc"
Erste von allen, sollten Sie die Zuweisung
int
s richtig:Dann können Sie array-subscripting:
oder einen Zeiger auf das Ende des zugeordneten Speichers:
Arrays repräsentieren zusammenhängende Blöcke von Speicher. Da der name des Arrays ist im Grunde ein Zeiger auf das erste element, können Sie die array Schreibweise verwenden, um Zugriff auf den rest des Blocks. Denken Sie jedoch daran, es gibt keine Fehlerüberprüfung von C: auf die Begrenzungen des Arrays, so dass, wenn Sie zu Fuß aus dem Ende des Speicherblocks, die Sie tun können, alle Arten von Dingen, die Sie gar nicht wollen und mehr als wahrscheinlich am Ende mit einer Art von memory fault oder segmentation Fehler. Da der int-Wert kann variabel sein, die Größe würde ich verwenden Sie diesen code statt:
Etwas wie, dass wird gut funktionieren. Die Art und Weise, dass du es tun, zumindest von dem code, den du gepostet hast, es gibt keinen Weg, um die Schleife zu stoppen, weil, sobald es über den Speicher-block, es wird halten, bis es läuft in eine NULL, oder Sie bekommen einen memory-Fehler. In anderen Worten, die Schleife wird nur beendet, wenn es läuft in eine null. Dass die null werden können, innerhalb der Speicherblock, der Sie zugeordnet sind, oder kann es sein Weg über den block.
EDIT: Eine Sache, die ich bemerkte an meinem code. Es wird Speicherplatz für 40 ints, die entweder aus 4 bytes, 8 bytes, oder etwas anderes, je nach der Architektur der Maschine, die Sie arbeiten. Wenn Sie WIRKLICH wollen, nur 40 Byte ganze zahlen, dann tun Sie etwas wie dieses:
Oder Sie verwenden den Datentyp char oder ein unsigned char, wenn Sie benötigen. Eine andere Sache, die ich bemerkt. Die malloc-Funktion einen void-Zeiger geben die kompatibel mit allen Zeigern, so gibt es keine Notwendigkeit zu tun, eine Typumwandlung auf ein malloc.
Sowie arrays in C sind nicht begrenzt, so dass ein paar Optionen, die am häufigsten verwendet werden:
Andere Möglichkeit:
Und das Letzte ist die am nächsten, was Sie scheinen zu tun bedeuten:
Ich würde vorschlagen, Lesen Sie mehr auf wie Zeiger in C arbeiten. Sie scheinen nicht zu haben ein sehr gutes Verständnis von es. Denken Sie auch daran, dass C nimmt die Stützräder. Arrays sind nicht begrenzt oder beendet, in einem standard-Weg, und ein Zeiger (Adresse im Speicher) wird nie NULL sein, die nach der Iteration durch ein array, und der Inhalt ist ein Zeiger verweist, kann alles sein.