簡體   English   中英

C中兩個不同的指針指向同一個地址

[英]Two different pointers pointing to the same address in C

我在這段代碼中遇到了這個非常奇怪的事情。

#include <stdio.h>

int main()
{
    float d = 12.432;
    float *pd = &d;
    printf("Value of d is %f\n", *pd);
    printf("Address of d is %p\n", pd);
    printf("Address of d+1 is %p\n", (pd + 1));
    printf("Value at d+1 is %f\n", *(pd + 1));

    int c = 1;
    int *yh = &c;
    printf("Value of c is %d\n", *yh);
    printf("Address of c is %p\n", yh);
    printf("Address of c+1 is %p\n", (yh + 1));
    printf("Value at c+1 is %d\n", *(yh + 1));

    return 0;
}

當我在我的機器上運行這個片段時, d+1c的地址是相同的。當我在 repl.it 或一些在線編譯器上運行時,我得到的地址應該不同。 問題是什么?

注意:C 標准不要求指針與 memory 地址直接相關。 然而,這是大多數現代系統的工作方式。 這個答案假設這樣一個系統

在我的機器中,d+1 和 c 的地址是相同的

我假設您的意思是:(d 的地址)+1 和 c 的地址是相同的。

這沒有什么奇怪的。

pd + 1等於yh時,它僅僅意味着 integer c被放置在 memory 中,就在浮動d之后。

+---------+ <------- pd
|    d    |
+---------+ <------- pd+1 and also yh
|    c    |
+---------+ <------- yh+1

在另一個系統上,它可能是:

+---------+ <------- pd
|    d    |
+---------+ <------- pd+1
| unused  |
+---------+ 
| unused  |
+---------+
| unused  |
+---------+ <------- yh
|    c    |
+---------+ <------- yh+1

在這種情況下pd+1yh不同

...我得到不同的地址,因為它應該給出

這兩種情況都是合法的。 一個系統可以處理第一種情況,而另一個系統可以處理第二種情況。 所以不,它“應該給出”不同的地址是不正確的。

順便提一句:

雖然pd+1是合法的,但像*(pd+1)那樣取消引用它是非法的,因為那里沒有浮點數。 所以刪除行printf("Value at d+1 is %f\n", *(pd + 1)); 這是非法的,也與問題無關。

這同樣適用於: printf("Value at c+1 is %d\n", *(yh + 1));

float是一個大小為 4 個字節的類型。

當您執行指針運算時,您會計算從原始地址偏移類型大小的數倍的地址。

pd+1指向變量 d 后一個浮點數的地址。

通常,您的編譯器可能會依次將所有聲明的變量依次放入 memory:d、pd、c 和 yh,因為它們是按順序聲明的; 但不能保證,它可能會選擇不這樣做。

如果您的編譯器選擇將變量 d、變量 c 放置在 memory 中的兩個連續 32 位空間中,那么通常以下斷言將成立:

(pd+1) == &c

這似乎是你的情況。 沒有問題。

暫無
暫無

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

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