这个演员出了什么问题?

Ste*_*hen 1 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'],换句话说,此函数将数字函数转换为英语等价物.

Sto*_*ica 9

与普遍和错误教导的信念不同,数组不是指针.它们可能在大多数情况下衰减为指针,但运算符地址不是这些上下文之一.

如果类型z_stringschar[3],那么类型&z_stringschar (*)[3].它是指向三个字符数组的指针.并且指向数组的指针与指针指针不兼容.

这就是你演员的错误.至于如何修复它,使用你已经显示的小上下文,显而易见的解决方案是引入一个实际的指针:

char *p_z_strings = z_strings; //decay here
MyFunction(myints, &p_z_strings , another_int_arg); // no cast; exact match
Run Code Online (Sandbox Code Playgroud)

通过您提供的附加上下文,"显而易见"的解决方案现在相当明显不正确.还有一些细节缺失,但如果我们在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
Run Code Online (Sandbox Code Playgroud)