void 指針:揭示C 和C 之間的鴻溝
當談到void 指針時,C 和C 表現出不同的行為。問題圍繞著將 void* 傳回值指派給非 void 指標的允許性。
在C 中,允許進行此類分配,如以下編譯無錯誤的程式碼所示:
<code class="c">int* p = malloc(sizeof(int));</code>
然而,在C 中,相同的程式碼無法編譯,這凸顯了C 中更嚴格的類型檢查。這種差異源自於 void 指標處理方式的差異。
雖然 C 允許 void 和任何其他指標類型之間的隱式轉換,但 C 限制了這種自由。在 C 中,從 void 到特定指標類型的轉換需要明確強制轉換。因此,要在 C 中編譯以下程式碼,需要強制轉換:
<code class="c++">int* p = (int*) malloc(sizeof(int));</code>
儘管存在這種差異,C 確實允許從非 void 指標到 void* 的隱式轉換。這個特性在下面的程式碼中很明顯:
<code class="cpp">void foo(void* vptr) { } int main() { int* p = (int*) malloc(sizeof(int)); foo(p); return 0; }</code>
這段程式碼在 C 和 C 語言中編譯都沒有問題。原因在於 void 固有的靈活性和指標的本質。任何物件指標都可以安全地轉換為 void 而不會遺失資訊。當 void* 轉換回其原始指標類型時,將恢復精確的指標。 K&R2 的引用說明了這一點:
「任何指向物件的指標都可以轉換為void * 類型,而不會遺失資訊。如果結果轉換回原始指標類型,則還原原始指標。」
以上是為什麼在 C 中我不能將 `void*` 賦給非 Void 指針,但在 C 中卻可以?的詳細內容。更多資訊請關注PHP中文網其他相關文章!