2016-03-31 11 views
3

Beschränkte qualifizierte Zeiger wurden mir mit einer Regel erklärt: Auf jedes Objekt, auf das der Zeiger zugreift und an irgendeiner Stelle geändert wird, wird immer nur vom Zeiger zugegriffen. Also funktioniert folgendes nicht, oder?Passing einschränken qualifizierte Zeiger auf Funktionen?

void agSum(int * restrict x, int n){ 
    for(int i=0; i<n-1; i++) x[i+1] += x[i]; 
} 

int SumAndFree(int * restrict y, int n){ 
    agSum(y); 
    printf("%i",y[n-1]); 
    free(y); 
} 

Also, ich denke, das ist ungültig, weil y [n-1] geändert wird irgendwo nicht direkt von dem Zeiger y beschränkt zugegriffen, und es wird durch y lesen.

Wenn das stimmt, wie können Sie Funktionen aufrufen, wenn der Eingabezeiger eingeschränkt ist? Es scheint, dass die Funktion nichts tun kann, ohne die Einschränkungsregel zu verletzen.

Ist es ein weiterer Verstoß, den Zeiger zu sperren? Das ist eine Art Modifikation, denke ich.

Vielen Dank im Voraus!

Antwort

1

Ihr Code ist korrekt. Wenn SumAndFreeagSum aufruft, übergibt es einen Zeiger, der von y abgeleitet wird. Alle Zugriffe unter dem Block SumAndFree werden also mit den von y abgeleiteten Zeigern durchgeführt.

Es ist in Ordnung, free zu nennen.

Ihre Funktionen machen keine Lese- oder Schreib andere als x und y, so restrict dient eigentlich keinen Zweck in diesem Fall genau.

+0

Oh! Vielen Dank! – Sheila