2017-06-14 31 views
3

我是編程新手,目前正在C上工作。按C中的值致電

我瞭解到C沒有引用調用。我們寫信給實際參數的地址傳遞給形式參數的程序也由價值C.

打電話糾正我,如果我錯了。但是,我跑這個程序:

//使用函數交換兩個數字。 的#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; 
} 

它編譯就好了。但是,我在輸出得到一個分段錯誤。

它要求我輸入X和Y的值,然後給出,段錯誤..

請幫助!

+1

你應該通過'交換(x,&Y)'通過地址的這些變量。 – vtha

+5

如果啓用所有警告和調試信息,它將不會編譯。通過使用[GCC](http://gcc.gnu.org/)的'gcc -Wall -Wextra -g',你*會得到你應該照顧的警告。 –

+0

你的編譯器告訴你什麼? –

回答

5

如此接近

swap(&x,&y); 

你沒有通過引用(指針)

+0

謝謝!現在有意義 –

6

您正在發送int給需要int*,因此,當你提領一個功能 - temp=*b;您試圖訪問內存你不擁有 - >段錯誤。請致電swap這樣:swap(&x,&y);

+1

謝謝!現在有意義 –

0

通過值的調用方法將參數傳遞給函數將參數的實際值複製到函數的形式參數中。在這種情況下,對函數內部的參數所做的更改對參數沒有影響。 但在這裏,你逝去的值

swap(x,y) 

,但以它爲地址

void swap(int *a,int *b)

所以它在尋找它通過了你的變量的地址。 例如,如果你已經通過類似

swap(x,y)

和 如果we have x=100 and y=200,則假設100和200是地址 並試圖訪問它一定會讓你的錯誤,因爲他們可能不存在或有垃圾價值。

+0

謝謝!現在有道理 –

1

爲避免運行時出現類似的段錯誤,請始終使用-Wall進行編譯。

其實,有一種方式來傳遞,通過引用在C,只是改變你的兩行代碼是這樣的:

#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); 
}