簡體   English   中英

指針到指針數組中指針的訪問地址

[英]Access address of pointer in pointer-to-pointer array

4我試圖從指向指針數組的指針獲取指針地址,但是當我運行下面的代碼時,我只會得到垃圾。 如何從char **數組中檢索char *之一的指針地址? 感謝您對此進行檢查。

具體來說,我想通過“ what”獲取“ wh”的地址並將其分配給“ hi”。

char * hi;
char * wh;
char ** what;

int main(void) {
    char z[4] = "wx\0";
    char a[4] = "ab\0";
    hi = &z;
    wh = &a;
    what = (char **) malloc( 25 * sizeof(char));
    what[0] = &hi;
    what[1] = &wh;

    printf("%s | %s\n", hi, wh);

    hi = &what[1];

    printf("%s | %s\n", hi, wh);

    return EXIT_SUCCESS;
}

更正的代碼:

#include <stdio.h>
#include<stdlib.h>
char * hi;
char * wh;
char ** what;

int main(void) {
    char z[3] = "wx\0";
    char a[3] = "ab\0";
    hi = z;
    wh = a;
    what = malloc(2 * sizeof *what);
    what[0] = hi;
    what[1] = wh;

    printf("%s | %s\n", hi, wh);

    hi = what[1];

    printf("%s | %s\n", hi, wh);

    return 0;
}

hiwh的類型&z&a ,即使它們應產生相同的值。 另外,您不希望hi what[1]是它所在的存儲位置的值。 另外,在C中,您無需強制轉換malloc的返回值。 但是,在C ++中,盡管更好地使用new運算符,但仍需要強制轉換。

指針分配

  • hiwh被定義為指向char的指針 因此,請更改您的工作分配表

    從,

     hi = &z; /* Type of &z is pointer-to-array-of-4-char */ wh = &a; /* Type of &a is pointer-to-array-of-4-char */ 

    至,

     hi = z; /* Type of z is pointer-to-char. Array name, here, decays into pointer to first element of the array */ wh = a; /* Type of a is pointer-to-char */ 

  • what被定義為類型, 指針指向char。 因此,更改您的malloc語句

    從,

     what = (char **) malloc( 25 * sizeof(char)); /* what needs to hold char*'s, you have allocated only for char's */ 

    至,

     what = malloc(25 * sizeof *what); /* what is of type char**. *what gives you char* */ 

  • 另外,更改您的whathi賦值語句

    從,

     what[0] = &hi; /* Type of what[0] is pointer-to-char; Type of &hi is pointer-to-pointer-to-char */ what[1] = &wh; /* Type of what[1] is pointer-to-char; Type of &wh is pointer-to-pointer-to-char */ ... hi = &what[1]; /* Type of hi is pointer-to-char; Type of &what[1] is pointer-to-pointer-to-char */ 

    至 ,

     what[0] = hi; /* Types are same */ what[1] = wh; /* Types are same */ ... hi = what[1]; /* Types are same */ 

注:大小what比真正需要的發布程序過高。 如果您有相同的程序,請在malloc中將25修改為2

char * hi;
char * wh;
char ** what;

int main(void) {
    char z[4] = "wx\0";
    char a[4] = "ab\0";
    hi = &z;
    wh = &a;

第一個錯誤; 表達式&z&a類型均為char (*)[4] (指向char 4元素數組的指針),而不是char * 要解決此問題,請同時刪除&

    hi = z;
    wh = a;

除非它是sizeof或一元&運算符的操作數,或者是用於初始化數組的字符串文字,否則類型“ N的T元素數組”的表達式將被轉換(“ decay”)為鍵入“指向T指針”,表達式的值就是數組中第一個元素的地址。

    what = (char **) malloc( 25 * sizeof(char));

不要轉換malloc的結果; 不必要1 ,並且根據編譯器版本,它可以抑制有用的診斷。 您也有類型不匹配。 您想為char分配25個指針,但是您只分配了25個char 重寫為

    what = malloc( sizeof *what * 25 );

類型表達的whatchar ** ; 因此,表達式*whatchar * 所以sizeof *what的結果與sizeof (char *)結果相同。 上一行分配了足夠的內存來存儲25個指向char指針,並將結果指針分配給what

    what[0] = &hi;
    what[1] = &wh;

同樣,刪除& ; hiwh已經是char指針:

    what[0] = hi;
    what[1] = wh;

    printf("%s | %s\n", hi, wh);

    hi = &what[1];

類型不匹配; &what[1]類型為char **hi類型為char * 同樣,刪除&

    hi = what[1];

hiwh現在指向同一事物( what[1] == whhi == what[1] ,所以hi == wh ;也就是說, hiwh包含相同的指針值)。

    printf("%s | %s\n", hi, wh);

    return EXIT_SUCCESS;

}


1.在C中,即; C ++是另一回事,但是如果您正在編寫C ++,則無論如何都不應使用malloc

暫無
暫無

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

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