无法将char* []转换为char**

5
当我尝试一个只有这两行代码的测试程序时:
char array[256];
char** arrayPointer=&array;

我遇到了以下错误:

无法将char*[256]转换为char**。

但是,如果我这样做:

char array[256];
char* temp=array;
char** arrayPointer=&temp;

我没有收到这样的投诉。

我觉得可能是Eclipse出了问题(我的Eclipse现在也有点不正常),但当我尝试将&array强制转换为char**用于函数时,出现了异常行为,我的调试器暗示数组没有被正确修改。

PS. 所有内容都是手写的,请原谅笔误。


6
提示:如果您认为编译器有错误,您几乎肯定是错的。数组不是指针。数组不是指针。 - Adam Rosenfield
@AdamRosenfield 但是你能向提问者解释第二个例子为什么可以工作吗? - Mr Lister
@MrLister &temp 取得的是 temp 的地址,它并不关心 array 或者 temp 存储的任何地址。 - Kijewski
@AdamRosenfield 当谈到C++编译器时,如果你认为你的编译器有问题,那么它可能确实存在问题。我这么说是因为:#1 在我短暂的C++使用经验中,我发现了比其他任何编译器更多的编译器错误;和 #2 我看到的关于实际C++编译器错误的SO问题数量。 - R. Martinho Fernandes
@R.MartinhoFernandes,我仍然认为,在99,999/100,000次编译错误中,故障源头在于显示器前面。 - Kijewski
1
此外,大多数编译器错误表现为缺少错误消息或默默地执行错误操作。 - Greg Hewgill
1个回答

17
在C++中,数组和指针不是同一件事情。在许多情况下,数组可以被隐式转换为指针,但数组类型和指针类型是不同的。
在你的情况下,变量
char array[256];

类型为char[256]。如果您写&array获取它的地址,您将得到一个指向由256个char组成的数组的指针,其类型为char (*)[256]。这与char**不同。这实际上是一件好事。如果您可以进行转换,如果您这样做会发生什么?

char array[256];
char** ptrPtr = &array; // Not legal!
*ptrPtr = new char[256];
在这种情况下,第三行将“重新分配” array 以指向一个新的具有256个元素的数组。但是, array 不是指针!此操作是没有意义的。
你在编写代码时收到奇怪的调试器错误的原因是...
char array[256];
char** ptrPtr = (char**) &array; // Legal, but Bad Times!
*ptrPtr = new char[256];

你所进行的类型转换导致了未定义行为。你将一个指向256个实际char对象数组的指针伪装成指向char指针的指针,这是一种毫无意义的强制类型转换,因此当你这样做时所有的赌注都是打水漂的。

另一方面,如果你像下面这样明确引入一个char*变量:

char array[256];
char* ptr = array;
char** ptrPtr = &ptr;

然后一切都好了。在第二行,你创建了一个指向array的第一个元素的指针(实际类型为char*)。在第三行,你创建了一个指向那个新指针的指针。如果你接着写:

*ptrPtr = new char[137];

那么什么坏事都不会发生;你只是改变了ptr的指向,而没有销毁array

希望这可以帮到你!


非常感谢您提供如此详细的答案,但是我仍然感到困惑。在C语言中,我的理解是一个字符指针只是指向内存位置前面的指针。C++是否已经改变了这种C语言的行为(这似乎是一个非常糟糕的想法)? - dsollen
1
@JesseGood:不,你被误导了。数组指针衰减(我讨厌这个术语)只会在请求时发生。也就是说,当你尝试将一个数组赋值给一个指针时。 - Benjamin Lindley
此外,重新分配char**指针,使其不再指向原始字符数组会有什么危害?我将无法再找到存储内存的堆栈位置,但我可能本来就是这样想的。C++数组是否具有需要释放的其他状态,而不像在常规C中那样? - dsollen
2
@dsollen- 无论是C还是C++,都不会将数组视为序列第一个字符的指针。在C和C++中,数组是一种连续的、相同类型的对象块。数组可以衰减成为指向其第一个元素的指针,但它实际上并不是指向第一个元素的指针。"重新分配"数组没有意义的原因是你不能将一个元素块重新分配为另一个元素块。这能让事情更清晰一些吗? - templatetypedef
@BenjaminLindley:我改正了,当使用地址运算符&array时,不会发生任何衰减。感谢您指出这一点! - Jesse Good

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接