2014-03-04 22 views
0

我在YouTube上做了一個練習,結果他得到了同樣的解決方案,但他的代碼能夠獲得指針指向的地址,但是當我編譯並運行它時,出現錯誤分段錯誤(核心轉儲),我以某種方式訪問​​我不應該訪問的內存?他的代碼是如何運行的,但是我的代碼卻不能運行? 我知道問題出在printf(「num的地址是%d \ n」,* ptr);但是這條線在YouTube上工作,但在我的編譯器中它沒有。爲什麼我要分割(核心轉儲)?

#include <stdio.h> 

int print_int_ptr(); 

int main(){ 
    int num; 

    num = 10; 
    print_int_ptr(num); 


    return(0); 
} 
/* dont forget that in between the assignment of ptr = &num */ 

/* Take the address of an integer as a parameter, and print out both the 
    * address and the integer itself 
    */ 
    void print_int_ptr(int *ptr){ 

    printf("The address of num is %d\n", *ptr); 
    printf("The value of num is %d\n", ptr); 
    } 
+1

編譯程序並打開警告來識別此問題 –

回答

2

main()num是一個整數。你將它傳遞給print_int_ptr(int *ptr)

int *ptr意味着print_int_ptr()的第一個參數是一個指針,因爲int *聲明瞭一個指針。所以只要你輸入print_int_ptr(),ptr就被認爲是一個指針。但是num = 10,所以任何提及ptr都會指出地址10,顯然這是不對的。

這就是你在做什麼printf("The address of num is %d\n", *ptr);*ptr解除引用指針,它會嘗試訪問地址10處的值。但是,您不能在任意地址訪問值,除非您很幸運,並且操作系統正好給這個過程提供了一個值。

+0

謝謝你解釋這個,現在有很多意義。謝謝! – mvitagames

0

您的功能正在使用指針int *

所以請用print_int_ptr(&num);來替換電話。

並用printf("The value of num is %d\n", *ptr);替換行printf("The value of num is %d\n", ptr);

另外,如果要打印地址(即指針的值),請在printf中用%p替換%d

+0

.................? –

1

您將num聲明爲整數,並將其作爲print_int_ptr函數中的參數。我認爲當你聲明print_int_ptr函數時,你錯誤地聲明瞭它。它應該是一個int而不是ptr?

如果你沒有返回任何值,你應該聲明print_int_ptr函數爲void not int。

+0

是的,但我不知道如何print_int_ptr的參數是錯誤的?我試圖解決的問題說,創建一個名爲print_int_ptr的函數,它接受一個參數,一個指向整數的指針並打印出整數和地址。 – mvitagames

+0

好的,然後你的num = 10;語句嘗試將下一行更改爲print_int_ptr(&num);將num的地址傳遞給該函數,以便它可以分配給在 –

+0

以下的print_int_ptr函數中聲明的ptr u,因爲現在您將所需的整數放入參數中,並且把它分配給你的地址 –