我被告知以下是错误的代码,因为z_strings已经是一个char数组。但是我并不太了解C ++,所以我不知道用法在做什么或为什么会出错。有人可以提供解释吗?
声明:char z_strings[3];
用法:MyFunction(myints, (char**)&z_strings, another_int_arg);
MyFunction的定义:void MyFunction(int* my_ints, char** z_strings, int another_int_arg)
对于上下文,这是一个同事的代码审查"故意破坏的代码;他正在用它来询问面试候选人修复坏密码。然而,这位同事实际上离开了公司,并且唯一的笔记说它是一个糟糕的演员,我试图找出更多关于为什么的细节,因为我很好奇。
我删除了我认为无关的上下文,但对于完整的上下文,MyFunction实际上是GetPowers(p_int, (char**)&z_strings, 3);
p_int
将是一个类似[2,3,4]
的数组,z_strings
将填充值比如['Hundreds','Thousands','Ten Thousands']
,换句话说,这个函数将数字能力转化为英语等价物。
答案 0 :(得分:9)
与广泛且错误教导的信念不同,数组不指针。在大多数情况下,它们可能衰减指针,但地址运算符不是这些上下文之一。
如果z_strings
的类型为char[3]
,则&z_strings
的类型为char (*)[3]
。它是指向三个字符数组的指针。并且指向数组的指针与指针指针不兼容。
这就是你演员阵容的错误。至于如何修复它,使用你已经显示的小上下文,显而易见的解决方案是引入一个实际的指针:
char *p_z_strings = z_strings; //decay here
MyFunction(myints, &p_z_strings , another_int_arg); // no cast; exact match
使用您提供的添加上下文,“显而易见”的解决方案现在相当明显不正确。还有一些细节缺失,但如果我们假设GetPowers
将为新字符串分配,我们不需要额外的变量:
char* z_strings[3]; // Now we have an array of pointers
GetPowers(p_int, z_strings, 3); // It decays into a pointer to a pointer
// GetPowers populates it
答案 1 :(得分:1)
演员阵容很糟糕,因为它会关闭编译器而不修复代码。
真正的修复可能是使用正确的数组,这可能是(如函数参数类型所示)一个指针数组,例如
char *z_strings[3];
现在你可以在没有任何演员的情况下调用该函数:
MyFunction(myints, z_strings, another_int_arg);
答案 2 :(得分:0)
在C和C ++中,一个阵列衰变了#39;当标识符用作期望指针的函数的参数时指向一个指针。这意味着如果你有一个函数采用char*
(C和常见的C ++形式的字符串参数),那么你可以传递一个char
数组,不需要转换。
在您的示例中,您正在转换为char**
,它是指向char的指针。这表明函数期望改变char*
参数所指向的内容,这对于数组参数来说不是有意义的。在不知道更多背景的情况下,尽管如此,很难给出更具体的答案。它也可能是char**
参数可能是一个字符串数组(在这种情况下,你会期望一个额外的数组大小参数),但没有看到MyFunction()
打算做什么很难说。