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 );
表达式的类型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
== what[1]
,所以hi
== wh
;也就是说,两者都hi
包含wh
相同的指针值)。
printf("%s | %s\n", hi, wh);
return EXIT_SUCCESS;
}
1.在C中,即;malloc
C++ 是另一回事,但如果您正在编写 C++,则无论如何都不应该使用。