2017-06-14 6 views
3

Ich bin neu in der Programmierung und ich arbeite derzeit an C.Aufruf von Wert in C

Ich habe gelernt, dass C hat keinen Anruf per Referenz. Die Programme, die wir schreiben die Adresse der aktuellen Parameter auf die formalen Parameter übergeben wird, rufen auch von Wert in C.

Korrigieren Sie mich, wenn ich falsch bin .. aber ich dieses Programm lief:

// Tauschen von zwei Zahlen mit Funktionen. #include

void swap(int *,int *); 

void main() 
{ 
    int x,y; 
    printf ("Enter the values of x and y : "); 
    scanf("%d %d",&x,&y); 

    swap(x,y); 

    printf("The value of x = %d and y = %d",x,y); 
} 

void swap(int *a,int *b) 
{ 
    int temp; 

    temp=*b; 
    *b=*a; 
    *a=temp; 
} 

Es kompiliert ganz gut .. aber ich bin in der Ausgabe einen Segmentation Fault zu bekommen.

Es fragt mich, die den Wert von X und Y eingeben und dann gibt, Fehler Segmentation ..

Bitte helfen !!

+1

Sie sollten 'Swap-Pass (& x, & y)' die Adresse zu übergeben dieser Variablen. – vtha

+5

Es wird nicht nur kompilieren, wenn Sie alle Warnungen und Debug-Informationen aktivieren. Mit 'gcc -Wall -Wextra -g' mit [GCC] (http://gcc.gnu.org/) erhalten Sie * Warnungen, auf die Sie achten sollten. –

+0

Was sagt Ihnen Ihr Compiler? –

Antwort

5

So schließen

swap(&x,&y); 

Sie wurden nicht vorbei Referenzen (Zeiger)

+0

Danke! Sinn macht jetzt –

6

Sie eine int an eine Funktion senden, die int* erwartet, so dass, wenn Sie dereferencing - temp=*b; Sie versuchen, auf Speicher zuzugreifen Sie besitzen nicht -> segfault. Rufen Sie swap wie folgt an: swap(&x,&y);

+1

Danke! Sinn macht jetzt –

0

die Aufruf-nach-Wert-Methode der Übergabe von Argumenten an eine Funktion kopiert den tatsächlichen Wert eines Arguments in den formalen Parameter der Funktion. In diesem Fall haben Änderungen am Parameter innerhalb der Funktion keinen Einfluss auf das Argument. aber hier sind Sie vorbei Werte

swap(x,y) 

aber es wird sie als Adresse

void swap(int *a,int *b)

so auf der Suche nach einer Adresse unter die von Ihrem Variable übergeben. zum Beispiel, wenn Sie bestanden haben, so etwas wie

swap(x,y)

und wenn we have x=100 and y=200, dann wird es 100 und 200 unter der Annahme, Adressen und versuchen zu sein, um es auf jeden Fall Ihnen Fehler geben wird zugänglich, da sie nicht existieren oder einen Müllwert haben.

+0

Danke! Macht jetzt Sinn –

1

Um ähnliche Segmentfehler zur Laufzeit zu vermeiden, kompilieren Sie immer mit -Wall.

Eigentlich gibt es eine Möglichkeit, Pass-by-reference in C, nur zwei Zeilen wie diese in Ihrem Code ändern:

#define swap(x,y) swap_impl__(&(x), &(y)) 

static void swap_impl__(int *a, int *b) 
{ 
    int temp; 
    temp=*b; 
    *b=*a; 
    *a=temp; 
} 

void main() 
{ 
    int x,y; 
    printf ("Enter the values of x and y : "); 
    scanf("%d %d",&x,&y); 

    swap(x,y); 

    printf("The value of x = %d and y = %d",x,y); 
}