int main()
{
double **A;
initialize(&A, 10, 10);
}
Außerdem sollte der Code, wie Sie ihn gepostet haben, beim Übergeben von keinen Segmentierungsfehler verursachen A Zeiger hinein. Der Segmentierungsfehler tritt höchstwahrscheinlich auf, wenn Sie von der Funktion zurückkehren und versuchen, darauf zuzugreifen Aweil die A in main wird nicht initialisiert. Nur eine Kopie davon wird so initialisiert, wie Sie es tun, und diese Kopie ist lokal für die initialize Funktion, also geht es verloren, wenn Sie zurückkehren.
@LVlad Hallo, schöne Antwort. Ich besuche nur mein C: Wenn Sie einen Zeiger in C ändern möchten, müssen Sie einen Zeiger an einen Zeiger übergeben. Wenn Sie einen Zeiger auf einen Zeiger ändern müssen, müssen Sie einen Zeiger auf einen Zeiger an einen Zeiger übergeben. Wieso den? Können wir also sagen, wenn wir einen Wert ändern wollen, müssen wir auch einen Zeiger auf diesen Wert übergeben? Bitte erläutern Sie mehr. Danke im Voraus.
– Unheilig
7. Januar 2014 um 21:37 Uhr
HI Unheilig, das hängt mit Call by Reference zusammen. Zum Beispiel (irgendein Typ) *A then Wenn ein Typ an einer anderen Stelle geändert werden muss als dort, wo A derzeit definiert ist, müssen Sie die Adresse von A übergeben und müssen die übergebene Adresse in der aufgerufenen Funktion dereferenzieren. Der Grund für die Adressübergabe ist, dass die aufgerufene Funktion ihren separaten Stack im Adressraum des Prozesses erhält. Im obigen Problem befindet sich A, das in main() definiert ist, in einem separaten Stapel und es wird nie von initialize() darauf zugegriffen. Es wird kein Fehler gemeldet, wenn in main() nicht auf A zugegriffen wird.
– Vishal Sahu
11. März 2016 um 16:45 Uhr
Vielen Dank, ich kämpfe seit 3 Tagen damit.
– Hari Kiran Vusirikala
22. Juni 2017 um 13:28 Uhr
Wenn Sie einen Zeiger auf einen Zeiger ändern möchten, müssen Sie einen Zeiger auf einen Zeiger auf einen Zeiger übergeben.
Ich besuche nur mein C: Wenn Sie einen Zeiger in C ändern möchten, müssen Sie einen Zeiger an einen Zeiger übergeben. Wenn Sie einen Zeiger auf einen Zeiger ändern müssen, müssen Sie einen Zeiger auf einen Zeiger an einen Zeiger übergeben. Wieso den? Können wir also sagen, wenn wir einen Wert ändern wollen, müssen wir auch einen Zeiger auf diesen Wert übergeben? Bitte erläutern Sie mehr. Danke im Voraus.
– Unheilig
7. Januar 2014 um 21:38 Uhr
Zusammenfassend lässt sich sagen, dass Sie, wenn Sie einen Wert innerhalb einer Funktion ändern möchten, den Zeiger auf diesen Wert an die Funktion übergeben müssen. Werte werden (immer) nur (nach Wert) in Funktionen kopiert. Beispiel/Referenz
– j3141592653589793238
3. März 2019 um 17:52 Uhr
Nun, zum einen, die A inside initialize ist eine Kopie der A in main – Also, wenn Sie zurückkommen maines ist A ist noch nicht initialisiert. Wenn Sie versuchen, es zu benutzen – Boom!
Um es weiterzugeben initialize ‘by reference’, müssen Sie den Parametertyp ändern in double*** und eintreten &A in main. Dann, wenn Sie es in verwenden initializemüssen Sie es jedes Mal dereferenzieren, dh *A.
Sie suchen nicht nach Speichermangelfehlern. Scheitern.
Sie übergeben BY VALUE einen nicht initialisierten Wert A an initialize() und initialisieren diesen dann. Aber zurück in main() ist diese lokale Variable A immer noch nicht initialisiert. Stattdessen könnten Sie initialize() die zurückgeben lassen double** (z.B A = initialize(...)) oder ändere initialize() so, dass sein erster formaler Parameter a ist double ***pA mit der Sie initialisieren *pA = (double**)malloc(...);
Arsenal
Das ist die Art von Dingen, die Sie nicht tun möchten. Anstatt dafür unnötigerweise ein out-Argument zu verwenden, weisen Sie die Funktion zu und geben Sie das Ergebnis zurück. Tun Sie dies stattdessen:
int main()
{
double **A;
A = initialize(A10, 10);
}
double** initialize(int r, int c)
{
double **A;
A = malloc(sizeof(double *)*r);
for(int i = 0; i< r; i++) {
A[i] = (double *)malloc(sizeof(double) *c);
for(int j = 0; j < c; j++) {
A[i][j] = 0.0;
}
}
return A;
}
Sie haben vergessen, den Rückgabetyp von zu aktualisieren initializeund um tatsächlich einen Wert zurückzugeben.
– Karl Knechtel
2. Dezember 2010 um 20:14 Uhr
Sie haben vergessen, den Rückgabetyp von zu aktualisieren initializeund um tatsächlich einen Wert zurückzugeben.
– Karl Knechtel
2. Dezember 2010 um 20:14 Uhr
11367500cookie-checkC: Wie man einen Doppelzeiger an eine Funktion übergibtyes
Das wird nicht kompiliert, ohne initialize zu ändern —
&A
ist eindouble***
.– Stuart Golodetz
2. Dezember 2010 um 20:01 Uhr