【问题标题】:Access address of pointer in pointer-to-pointer array指针对指针数组中指针的访问地址
【发布时间】:2013-11-01 14:08:22
【问题描述】:

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

【问题讨论】:

  • 当你说“指针地址”时,你是指指针本身的地址,还是它所指向的地址?
  • 对不起,我应该更清楚,它指向的地址。
  • 谢谢,我的印象是字符串终止符 \0 是一个字符。我已经相应地更新了代码。
  • Please don't cast the return value of malloc() in C。你的电话也非常奇怪。
  • 当你调用 malloc 时,它返回一个 char*。你为什么要把它转换成char**?此外,调用 calloc(),而不是 malloc(),用于分配连续的内存块,如“25 个字符”。

标签: c pointers char


【解决方案1】:

更正的代码:

#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 的类型与 &amp;z&amp;a 的类型不同,尽管它们应该产生相同的值。您还希望hi 中的what[1] 不是它所在的内存位置的值。此外,在 C 中,您不需要强制转换 malloc 的返回值。然而,在 C++ 中,强制转换是必需的,尽管使用 new 操作符更好。

【讨论】:

  • what = (char **) malloc( 25 * sizeof(char)) 已损坏,或至少具有误导性。因此,代码尚未“更正”。像往常一样,使用sizeof 下的类型名称和malloc 的转换结果是错误的秘诀。应该是what = malloc(25 * sizeof *what)
  • malloc() 应修改为分配给char *
  • 我看到 Acme 已编辑为 malloc() 的 One True(TM) 形式,太好了!
【解决方案2】:

指针赋值

  • hiwh 被定义为指向字符的指针。所以,改变你的赋值语句

    来自,

    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

【讨论】:

    【解决方案3】:
    char * hi;
    char * wh;
    char ** what;
    
    int main(void) {
        char z[4] = "wx\0";
        char a[4] = "ab\0";
        hi = &z;
        wh = &a;
    

    第一个错误;表达式&amp;z&amp;a 的类型都是char (*)[4](指向char 的4 元素数组的指针),而不是char *。要解决此问题,请从两者中删除 &amp;

        hi = z;
        wh = a;
    

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

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

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

        what = malloc( sizeof *what * 25 );
    

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

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

    再次删除&amp;hiwh 已经是指向 char 的指针:

        what[0] = hi;
        what[1] = wh;
    
        printf("%s | %s\n", hi, wh);
    
        hi = &what[1];
    

    类型不匹配; &amp;what[1] 的类型为 char **hi 的类型为 char *。再次删除&amp;

        hi = what[1];
    

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

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      相关资源
      最近更新 更多