2017-10-23 6 views
0

Also arbeite ich derzeit mit einer Reihe von Strukturen, Zeigern und der Malloc-Funktion. So wie es aussieht, habe ich eine Struktur, die neben anderen Variablen einen Zeiger auf einen bestimmten Speicherplatz enthält, der mit der malloc-Funktion zugewiesen wurde.Versetze einen Zeiger auf einen Zeiger mit einer Zählvariablen

Ich benutze diesen Platz zum Speichern von Samples und deshalb verwende ich eine einfache Zählvariable, um zu verfolgen, wie viele Samples es gibt. Jetzt entstehen meine Schwierigkeiten durch die Schnittstelle mit meiner I2C-Funktion, die einen dreifachen Zeiger (signed char ***) verwendet, um die Daten zu speichern.

Um dies zu handhaben, verwende ich einen Doppelzeiger (signed char **), um auf den Speicherplatz von dem Zeiger in der Struktur angeboten und dann verwende ich die count-Variable, um diesen Zeiger zu verschieben.

Was ich finde ist, dass das Hinzufügen des Offsets einfach aus dem Speicher erhöht wird, wo der Anfangszeiger gehalten wird.

Die Codezeile, die ich versuche, dies zu erreichen, ist unten.

signed char** VAL_PTR = ((signed char**)(&mem.Accel.xBase)) + ((signed char) mem.Accel.SampleCount); 

Kann jemand sehen, wo ich falsch liege? Jede Hilfe würde sehr geschätzt werden!

+1

sein "*, die einen dreifachen Zeiger verwendet (signed char \ * \ * \ *) *" <- seien Sie nicht ein [Drei Star-Programmierer] (http://wiki.c2.com/?ThreeStarProgrammer). Tatsächlich sieht die einzelne Codezeile, die Sie präsentieren, zu komplex aus. Vielleicht sollten Sie sich mit der strengen Aliasing-Regel vertraut machen, in jedem Fall ** neu beginnen **, indem Sie zunächst Ihre Datenstrukturen und den Programmablauf entwerfen und auf ein ** einfaches ** Design abzielen. –

+0

Wir müssen ein vollständiges (aber minimales) Beispiel sehen, das die Typen aller Variablen anzeigt und erklärt, was das erwartete Ergebnis ist und was Sie stattdessen erhalten. Das Zeigen mit Code ist besser als das Zeigen mit Wörtern. – interjay

Antwort

0

xBase Wenn ein Zeiger ist ein Zeiger auf xBase (d.h. &xBase) ist im Grunde äquivalent zu einem Zeiger auf das erste Element eines Arrays aus einem Element von Zeigern. In Ihrem Fall entspricht &xBase grundsätzlich dem Typ signed char *[1].

I.e. es sieht so etwas wie diese

 
+-------+ 
| xBase | 
+-------+ 
^ 
| 
&xBase 

Nun, wenn Sie, dass für jeden Zeiger oder Array p und Index i erinnern, der Ausdruck *(p + i)-p[i] genau gleich ist. Wenn wir in &xBase und SampleCount dann ersetzen, was Sie haben, ist *((&xBase) + SampleCount), die (&xBase)[SampleCount] gleich ist, die Elementnummer SampleCount + 1 einer Anordnung von ein Element ist. Es wird außerhalb der Grenzen sein.

Das oben "Bild" mit dem Zusatz etwas wie

 
+-------+ 
| xBase |    ??? 
+-------+ 
^      ^
|      | 
&xBase     &xBase + SampleCount 
+0

Kurz gesagt, ich frage mich, ob ich einen Offset zu der Adresse hinzufügen kann, auf die xBase zeigt, wenn Sie dem Zeiger auf einen Zeiger zuweisen? –

+0

@ A.Derby Kurz gesagt, nein. '& xBase + SampleCount' zeigt nirgendwo hin. Aber Sie können 'xBase + SampleCount' natürlich tun, es ist einfach das gleiche wie' & (xBase [SampleCount]) '(was bedeutet, dass der Wert in' SampleCount' einen gültigen Index benötigt). *** Das Casting scheint jedoch nicht korrekt zu sein, es sei denn, jedes Element im Speicher, auf das "xBase" zeigt, ist * ein Zeiger. –

+0

Ah richtig fantastisch das hat genau so funktioniert wie gewünscht! Ich verwendete die Typumwandlung, um Zeigerkompatibilität zu ermöglichen. Vielen Dank !! –

Verwandte Themen