2016-11-02 235 views
0

片段將id的值傳遞給採用普通void *結構的例程。我很困惑爲什麼它的工作原理:爲什麼你可以投longvoid*並投下回long通過指針將值傳遞給void

特別是,我在想如果你想通過指針傳遞,那麼你應該把變量的地址如&id傳遞給test()函數。

#include <stdio.h> 

void test(void * id) { 
    long myid; 
    myid = (long) id; 
    printf("my id is %ld\n", myid); 
} 

int main() { 
    long id = 5; 
    test((void *)id); 
} 

回答

4

它的工作原理,因爲(您的系統上!)的void*指針本身包含足夠的位持有long值的所有位。這不是便攜式的。

你是對的,你通常會投long*void*回來。這是便攜式。

1

它可以工作,因爲指針只是數字。

你的測試函數「認爲」它收到一個指向內存位置5的指針,你當然可以打印這個地址。你不能分配任何東西到這個位置,所以* myid = 42會導致分段錯誤。將數字轉換爲指針在語法上是正確的,因此編譯器不會呻吟,但它沒有任何意義。運行此代碼並查看打印時指針的外觀(忽略來自編譯器的警告)。

#include <stdio.h> 

void test(void *id, long *foo) { 
    long myid; 
    myid = (long) id; 
    printf("my id is %ld, %ld\n", myid, foo); 
} 

int main() { 
    long id = 5; 
    long foo; 
    foo = 42; 
    test((void *)id, &foo); 
} 
+0

這不是打印'foo'值的正確方法。使用'printf(「%p」,(void *)foo);/*更好* /'或'printf(「%ld」,(long)foo);/*更糟* /' – user694733

+0

指針不是「只是數字」。着名的8086「遠」指針是_兩個數字。 (段/偏移) – MSalters

1

我很困惑,爲什麼它的工作原理:爲什麼你可以投長爲void *,並用長投回來。

long id = 5; 
test((void *)id); 

這實際上是有效的。你的基本意思是將void指針傳遞給函數test,該指針保存地址5

void test(void * id)中,您將該指針轉回long,這也是有效的。

請注意,在你的代碼中你永遠不會遵從指針,所以事情的工作。如果確實取消引用id中的,則通常會由於內存訪問不良而導致段錯誤。