指针到指针数组中指针的访问地址

时间:2013-11-01 14:08:22

标签: c pointers char

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

3 个答案:

答案 0 :(得分: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;
}

hiwh的类型与&z&a的类型不同,即使它们应该产生相同的值。您还希望what[1]中的hi不是内存位置的值。另外,在C中你不需要转换malloc的返回值。但是,在C ++中,虽然使用new运算符更好,但需要强制转换。

答案 1 :(得分:2)

指针分配

  • 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被定义为type,指向char 指针的指针。因此,请更改malloc声明

    来自,

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

    to,

    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 */
    

    to,

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

注意: what的大小太高于发布程序的实际要求。如果您觉得,您将拥有相同的计划,请在25中修改2malloc

答案 2 :(得分: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](指向char的4元素数组的指针),而不是char *。要解决此问题,请从两者中删除&

    hi = z;
    wh = a;

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

T

不要投射 what = (char **) malloc( 25 * sizeof(char)); 的结果;它不一定是 1 ,并且根据编译器版本,它可以抑制有用的诊断。您也有类型不匹配。你想要25个指向malloc的空间,但你只需要为25个普通char分配足够的空间。将其重写为

char

表达式 what = malloc( sizeof *what * 25 ); 的类型为what;因此,表达式char **的类型是*what。因此,char *会为您提供与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]wh == hi,所以{{ 1}} == what[1];也就是说,hiwh都包含相同的指针值)。

hi

<小时/> 1。在C中,即; C ++是一个不同的故事,但是如果你正在编写C ++,那么你不应该使用wh