这个演员怎么了?

时间:2017-11-01 16:52:16

标签: c++

我被告知以下是错误的代码,因为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'],换句话说,这个函数将数字能力转化为英语等价物。

3 个答案:

答案 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()打算做什么很难说。