簡體   English   中英

關於雙指針的澄清 - 無法解釋行為

[英]clarification about double pointers - cannot explain the behavior

在准備期末考試時,我偶然發現了以下問題:鑒於這段代碼:

#include <stdio.h>

int main() {

    const char *const ptr1[] = {"to be", "or not to be", "that is the question"};
    char *ptr2 = "that is the question";

    (&ptr2)[3]="hamlet";
    for (int i = 0; i < sizeof(ptr1) / sizeof(*ptr1); ++i)
        printf("%s ", ptr1[i]);
    return 0;
}

打印以下內容:“成為小村庄就是問題”

我認為這段代碼不會編譯。

但是,代碼可以編譯。

有人可以幫我理解為什么這段代碼會這樣嗎?

它可能會編譯,因為代碼中沒有任何內容需要編譯器來診斷問題。

分配在類型正確的意義上起作用。 ptr2char*類型,所以&ptr2char**類型, (&ptr2)[3]char*類型,我們可以分配一個字符串文字。

但是, ptr2不是數組,因此無法在偏移量3處訪問它。 該程序具有未定義的行為,因此聲明特定的 output 是沒有意義的。

編譯程序時啟用警告和清理程序,看看有什么問題: https://godbolt.org/z/G67j6qr7a

代碼編譯,賦值本身就 C 語言語法和約束 go 有效。 但是,它會調用未定義的行為(請參閱什么是未定義的行為以及它是如何工作的? ),因為您越界訪問變量ptr2 - 這是無稽之談。 我沒有得到你在我的編譯器上聲稱的 output,只是因為這段代碼沒有確定性的結果。

在某些系統上,越界訪問可能會生成對堆棧上先前聲明的數組的訪問,但不能保證這種行為。 大多數系統都有向下計數的堆棧,所以我認為它們中的很多最終不會像假設的那樣修改指針數組。 此外,編譯器可以自由地在彼此相關的任何地址分配ptr1ptr2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM