Pointer on Pointer Problem

So Ich habe -Wall eingefügt.

Das es mit dem Void Zeiger umständlich ist, habe ich mir auch gedacht, aber die Aufgabe ist so gestellt:

a) Schreiben Sie eine Funktion, die ein Feld mit double-Werten initialisieren soll. Dazu sollen die Gro?ße des gewu?nschten Feldes und ein Pointer u?bergeben werden. Prototyp: void allocMem(int length, void **ptrptr); Die Funktion soll per malloc Speicher anfordern, und den Pointer auf den Speicherbereich auf die uebergebene Variable korrekt speichern. Anschließend soll das Feld per memset (infor- mieren Sie sich per man–Page u?ber den Befehl) mit Nullen initialisiert werden.


Ich habe zuvor auch nur ein wenig in der Schule programmiert und deswegen auch nur ein kleines Basiswissen.

Code:
int main () {

	
	
	double **ptrptr;
	double *ptr;
	
	double wert;
	
	ptrptr =&ptr;
	ptr= &wert;
	
	
	int laenge=10;
	
	
	
	
	
 	allocMem(laenge, (void*)(*ptrptr)); 
	
	free(*ptrptr);
    return 0;
	
}

Zeigen die Zeiger denn jetzt richtig ? Ich weiß nicht wirklich wie die Syntax aussehen soll.
 
Hi.

Das mit der int Variablen im letzten Beitrag war nur ein Beispiel. Die wert Variable brauchst du nicht.

Wieso dereferenzierst du denn den Zeiger beim Aufruf? Du solltest auf keinen Fall casten müssen
C:
allocMem(laenge, (*ptrptr));
Compilermeldung:
Code:
memf.c:16:5: warning: passing argument 2 of 'allocMem' from incompatible pointer type
memf.c:2:6: note: expected 'void **' but argument is of type 'double *'
Es wird nicht besser wenn du einfach den Fehler wegcastest!

Die Funktion erwartet als 2. Parameter ein (void**), du übergibst ein (double*). Das passt nicht zusammen.

Außerdem hatte ich dir doch bereits gezeigt wie du die Funktion verwenden mußt...
C:
int main(void) {
  double* ptr; // das soll auf ein Array zeigen.

  double** ptrptr = &ptr;
  int laenge = 10;

  allocMem(laenge, ptrptr);
}
\edit: auch mit diesem Code erhälst du eine Warnung:
Code:
memf.c:16:5: warning: passing argument 2 of 'allocMem' from incompatible pointer type
memf.c:2:6: note: expected 'void **' but argument is of type 'double **'
In C muss man eben wissen was man tut und entscheiden, ob die Warnung gerechtfertigt ist, oder nicht.

In dem Fall stimmen die Stufen der Indirektion (2 Sternchen bei void** und auch bei double**), also ist das korrekt so. Hat man sich überzeugt davon, das die Warnung an der Stelle nicht signifikant ist, dann kann man getrost nach (void**) casten.

Gruß
 
Zuletzt bearbeitet:
Die Funktion erwartet doch einen void da kann ich doch nicht einfach ein double übergeben.


Code:
void allocMem(int length, void **ptrptr){
	
	
    int k =0;
	
    *ptrptr =(void*)(malloc(length*sizeof(double)));
	
	
	for(k=0;k<length;k++){
	memset(ptrptr[k],0.0,length*sizeof(double));
	}
	
};

Ich weiß nicht wie ich das umgehen soll.
*ptrptr entspricht doch jetzt *ptr in der main oder muss ich das innerhalb der Funktion erneuet zuweisen.

Edit
Ich habe deine edit gelesen. Aber die Funktion scheint ja verhunzt zu sein, aber ich habe (mal wieder :-( ) keine Ahnung warum ...
 
Zuletzt bearbeitet:
Die Funktion erwartet doch einen void da kann ich doch nicht einfach ein double übergeben.
Das stimmt nicht. Die Funktion erwartet einen (void**) und du übergibst einen (double**).

Siehe den Edit in meinem letzten Beitrag.
Code:
void allocMem(int length, void **ptrptr){
	
	
    int k =0;
	
    *ptrptr =(void*)(malloc(length*sizeof(double)));
	
	
	for(k=0;k<length;k++){
	memset(ptrptr[k],0.0,length*sizeof(double));
	}
};
Nochmal: es ist nicht möglich (sprich: es könnte klappen, funktioniert aber nicht immer und überall) memset zu verwenden um ein Array mit 0.0 zu füllen. Sag deinem Tutor einfach, das es Quatsch ist.

Mach einfach eine Schleife:
C:
for (k = 0; k < length; ++k) (*ptrptr)[k] = 0.0;
*ptrptr entspricht doch jetzt *ptr in der main oder muss ich das innerhalb der Funktion erneuet zuweisen.
Nein, da mußt du nichts anders zuweisen. Und nein, *ptrptr entspricht nicht *ptr. ptrptr in allocMem entspricht ptrptr in main und *ptrptr in allocMem entspricht ptr in main.

\edit: Du könntest die Sache in der Funktion etwas vereinfachen (vom Verständnis her):
C:
void allocMem(int length, void **ptrptr) {
  double *x = malloc(sizeof(double) * length);

  for (int i = 0; i < length; ++i) {
    x[i] = 0.0;
  }
  *ptrptr = x;
}
Gruß
 
Zuletzt bearbeitet:
Zurück