webentwicklung-frage-antwort-db.com.de

Zeiger von einer Funktion zurückgeben

Ich versuche, den Zeiger von einer Funktion zurückzugeben. Aber ich bekomme Segmentierungsfehler. Bitte sagen Sie jemandem, was mit dem Code falsch ist

#include<stdio.h>
int *fun();
main()
{
    int *ptr;
    ptr=fun();
    printf("%d",*ptr);

}
int *fun()
{
    int *point;
    *point=12;  
    return point;
}   
25
user567879

Weisen Sie Speicher zu, bevor Sie den Zeiger verwenden. Wenn Sie keinen Speicher zuweisen, ist *point = 12 undefiniertes Verhalten.

int *fun()
{
    int *point = malloc(sizeof *point); /* Mandatory. */
    *point=12;  
    return point;
}

Auch Ihr printf ist falsch. Sie müssen den Zeiger dereferenzieren (*).

printf("%d", *ptr);
             ^
43
cnicutar

Obwohl das Zurückgeben eines Zeigers auf ein lokales Objekt eine schlechte Praxis ist, hat es den Kababoom hier nicht verursacht. Hier haben Sie einen Segfault:

int *fun()
{
    int *point;
    *point=12;  <<<<<<  your program crashed here.
    return point;
}

Der lokale Zeiger geht aus dem Gültigkeitsbereich heraus, dereferenziert jedoch einen Zeiger, der nie initialisiert wurde. Was ist der Wert von Punkt? Wer weiß. Wenn der Wert keinem gültigen Speicherort zugeordnet wurde, erhalten Sie ein SEGFAULT. Wenn es zum Glück auf etwas Gültiges abgebildet wurde, dann haben Sie nur den Speicher beschädigt, indem Sie diesen Platz mit Ihrer Zuweisung auf 12 überschrieben haben.

Da der zurückgegebene Zeiger sofort verwendet wurde, können Sie in diesem Fall einen lokalen Zeiger zurückgeben. Es ist jedoch eine schlechte Praxis, denn wenn dieser Zeiger nach einem anderen Funktionsaufruf, der den Speicher im Stack wiederverwendet hat, wiederverwendet wird, wäre das Verhalten des Programms undefiniert.

int *fun()
{
    int point;
    point = 12;
    return (&point);
}

oder fast identisch:

int *fun()
{
    int point;
    int *point_ptr;
    point_ptr = &point;
    *point_ptr = 12;
    return (point_ptr);
}

Eine andere schlechte, aber sicherere Methode wäre, den Integer-Wert als statische Variable zu deklarieren. Er würde sich dann nicht auf dem Stack befinden und wäre sicher vor der Verwendung durch eine andere Funktion:

int *fun()
{
    static int point;
    int *point_ptr;
    point_ptr = &point;
    *point_ptr = 12;
    return (point_ptr);
}

oder 

int *fun()
{
    static int point;
    point = 12;
    return (&point);
}

Wie bereits erwähnt, besteht der "richtige" Weg darin, über malloc Speicher auf dem Heap zuzuweisen.

17
invaliddata

Bei der Zuweisung des Werts 12 zum Integerzeiger wird kein Speicher zugewiesen. Deshalb stürzt es ab, weil es keinen Speicher findet.

Sie können dies versuchen:

#include<stdio.h>
#include<stdlib.h>
int *fun();

int main()
{
    int *ptr;
    ptr=fun();
    printf("\n\t\t%d\n",*ptr);
}

int *fun()
{
    int ptr;
    ptr=12;
    return(&ptr);
}
0
Varun Chhangani