Yahoo奇摩知識+將於 2021 年 5 月 4 日 (美國東部時間) 終止服務。自 2021 年 4 月 20 日 (美國東部時間) 起,Yahoo奇摩知識+服務將會轉為唯讀模式。其他Yahoo奇摩產品與服務或您的Yahoo奇摩帳號都不會受影響。如需關於Yahoo奇摩知識+ 停止服務以及下載您個人資料的資訊,請參閱說明網頁。

王董 發問時間: 電腦與網際網路程式設計 · 1 0 年前

兩個指標位址傳遞的問題

請問我有兩個指標變數

static ImgClr *img = NULL;

static ImgClr **img1 = NULL;

都是struct型別

那我要怎麼指定img1的指標位置給img

img1已經是一個有值的二維陣列

但是每次我需要把img1的一維資料給img

下一次img1的下一筆一維資料再給img

以此重複

而且每次我要存取資料時要用img[0].data存取

img=img1[timecount];

for (int i=1; i< numimg; i++){

 img++;

 img=&img1[timecount][i];

}

但是這樣去存取

img[0].data位址卻是錯的

他會跳到目前img的位置

而不是img[0]的位置

1 個解答

評分
  • 1 0 年前
    最佳解答

    我不曉得你怎麼設定 img1 這個指標的,你的問題我有碰過,那是我在處理 jpeg 的圖形陣列時,誤用了 image 陣列。如以下程式說明了錯誤所在。

    int a[10][10];

    int **b = a;

    int *c;

    int i;

    printf("a at %p, b point to %p\n", a, b);

    for(i = 0; i < 10; i++) {

    c = b[i];

    printf("c at %p, normal at %p\n", c, a[i]);

    }

    b[i] 與實際你想得到的 a[i] 不一樣,因為 b[i] 是位址 b+i 取內容。而 a[i] 卻是位址 a+i 取內容。看出來了嗎?b[i] 事實上未定義,從頭到尾 b 這個指標有空間,但是 b 以後的空間並沒有宣告。如果你真的要用 b[i] 這種東西,你應該做類似下列動作:

    b = (int **)malloc(sizeof(int *)*10);

    for(i = 0; i < 10; i++)

    b[i] = a[i];

    原本記憶體是如此:

    b-->ABC0 a

    ABC1 ?

    ABC2 ?

    ...

    分配記憶體給 b 後初始化它,變成

    b-->ABC0 a[0]

    ABC1 a[1]

    ABC2 a[2]

    你自己想想看吧。當初我也是想很久,因為我以前學的 C 指標可以亂用,指標的指標可以直接拿來指陣列,我還有點印象,現在的編譯器好像都限制了這點。

    參考資料: 人間電腦
還有問題?馬上發問,尋求解答。