2012-10-25 128 views
-2

對不起Noobie問題,我只是不能使下面的代碼工作?Noobie虛擬指針混淆

片段1:

int main(void) { 
    void *ptr; 
    *ptr = 1; 
    printf("%d", *ptr); 
    return 0; 
} 

片段2:

int main(void) { 
    void *ptr; 
    int a = 1; 
    ptr = &a; 
    printf("%d", *ptr); 
    return 0; 
} 

片段3:

int main(void) { 
    void *ptr; 
    int a = 1; 
    (int*)ptr = &a; 
    printf("%d", *ptr); 
    return 0; 
} 

任何想法?

+3

您的問題是什麼? – Mat

回答

0

提領void指針undefined behaviour

你應該試試這個

ptr=(int*)&a; 

創建int類型的一個指針

,然後這個PTR分配到這一點,你可以解引用該指針

int *p; 
p=ptr; 
printf("%d",*p); 
+0

感謝您的快速回復,無論如何可以將類型轉換操作符放在void指針的左側,類似於代碼片段3顯示'*(int *)ptr = 1;' – mko

+0

也是錯誤 – Omkant

+0

您必須使用我提到..但是你仍然不能在printf中使用* ptr ...因爲它也是一個無效的指針... – Omkant

1

Snippet 1
您無法取消引用空指針。
Snippet 2
同樣的錯誤。
Snippet 3
*(int*)ptr = &a;是不需要的。無效指針可以容納任何種類的指針的地址。

如果你想使用空指針,你可以做如下
void *p;
int a=5;
int *i_ptr = NULL;
p = &a
i_ptr = p
printf("\n %d",*i_ptr);

在這裏,您正在複製從虛空指針的地址給integert指針。但是你必須確定p包含一個指向int類型的指針的地址才能進行正確的類型轉換。

+0

+1指出我所有的問題。所以即使在類型轉換之後,void指針仍然不能去引用。我對嗎? – mko

+0

檢查http://www.cs.uleth.ca/~holzmann/C/C/pointerops –

1

你可以強制轉換這樣來代替指針(摘錄3)

printf("%d",*(int*)ptr);

在所有3個片段你提領void指針。這是標準所不允許的(或者是不確定的行爲,我不記得)。

+0

感謝男人,簡潔的回答 – mko

+0

@yozloy沒問題的人。 –

1

代碼段1沒有任何意義。你試圖將某些東西存儲到「空白」中,這是不可能的。

代碼段2是有意義的,但由於您無法獲取「指向void的指針」的內容,因此不能使用* ptr。相反,將其轉換爲指向int的指針,然後獲取該指針的內容。 printf("%d", *(int*)ptr);

代碼片段3沒有任何意義,類型轉換是無效的C語法。除此之外,它具有與片段2相同的問題。