0

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;
}
4

3 回答 3

3

更正的代码:

#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;
}

and的类型与hiand的类型wh不同&z&a尽管它们应该产生相同的值。此外,您想要what[1]hi不是它所在的内存位置的值。此外,在 C 中,您不需要强制转换 malloc 的返回值。然而,在 C++ 中,强制转换是必需的,尽管使用new运算符更好。

于 2013-11-01T14:14:02.420 回答
2

指针赋值

  • hi并被wh定义为指向 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* */
    

  • 另外,更改您的what,hi赋值语句

    从,

    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比发布的程序实际需要的大小太高。如果您觉得,您将拥有相同的程序,请修改252.malloc

于 2013-11-01T14:21:20.047 回答
0
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](指向 的 4 元素数组的指针char),而不是char *&要解决此问题,请从两者中删除:

    hi = z;
    wh = a;

除非它是sizeof或一元运算符的操作数&,或者是用于初始化数组的字符串字面量,否则“N 元素数组T”类型的表达式将被转换(“衰减”)为“指针”类型的表达式to T",表达式的值是数组中第一个元素的地址。

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

不要投射malloc;的结果 这不是必需的1,并且根据编译器版本,它可以抑制有用的诊断。你也有类型不匹配。您想为 25 个指向 的指针留出空间char,但您只为 25 个普通char的 s 分配了足够的空间。重写为

    what = malloc( sizeof *what * 25 );

表达式的类型whatchar **; 因此,表达式的类型*whatchar *。所以sizeof *what会给你同样的结果sizeof (char *)。上一行分配了足够的内存来存储 25 个指向 的指针char,并将生成的指针分配给what

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

再次,删除&; hi并且wh已经指向char

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

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

    hi = &what[1];

类型不匹配; &what[1]有类型char **hi有类型char *。再次,放下&.

    hi = what[1];

hi现在wh指向同一个东西(what[1]==whhi== what[1],所以hi== wh;也就是说,两者都hi包含wh相同的指针值)。

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

    return EXIT_SUCCESS;

}


1.在C中,即;mallocC++ 是另一回事,但如果您正在编写 C++,则无论如何都不应该使用。

于 2013-11-01T14:34:48.083 回答