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 :(得分: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;
}
hi
和wh
的类型与&z
和&a
的类型不同,即使它们应该产生相同的值。您还希望what[1]
中的hi
不是内存位置的值。另外,在C中你不需要转换malloc的返回值。但是,在C ++中,虽然使用new
运算符更好,但需要强制转换。
答案 1 :(得分: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
被定义为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* */
另外,请更改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 */
to,
what[0] = hi; /* Types are same */
what[1] = wh; /* Types are same */
...
hi = what[1]; /* Types are same */
注意:强>
what
的大小太高于发布程序的实际要求。如果您觉得,您将拥有相同的计划,请在25
中修改2
至malloc
。
答案 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]
;也就是说,hi
和wh
都包含相同的指针值)。
hi
<小时/> 1。在C中,即; C ++是一个不同的故事,但是如果你正在编写C ++,那么你不应该使用
wh
。