让我们拥有包含以下内容的文件:
file1.cpp
:double array[100];
file2.cpp
(file1.cpp
的客户):
/// What the difference between this:
extern double* array;
/// and this?
extern double array[];
如果我使用以第一种方式声明的数组,我会收到segfault。如果是第二,它可以正常工作。这让我很困惑,因为在常规的C ++程序中,我可以轻松地执行以下操作,这些对象将是相同的:
double array[100];
double* same_array = array;
/// array[0] is equal to same_array[0] here
/// But why they are not equal in the example with extern?
答案 0 :(得分:2)
不同之处在于,first是指向double类型的指针 第二个是双数组。
这里要注意的重要事项是:
具有数组类型(可以是数组名称)的表达式将在数组类型不合法时转换为指针,但指针类型为。
double array[100];
double* same_array = array;
根据提到的规则,在上面,数组名称衰减为指向其第一个元素的指针。
为什么程序会崩溃?
数组声明创建一个数组,该数组占用一些内存,具体取决于存储类(声明的位置)
指针只是创建一个指向某个地址的指针。你明确需要指出一些有效的对象才能使用它。
这应该是一个很好的阅读:
的 How do I use arrays in C++? 强>
答案 1 :(得分:2)
extern double* array;
当你现在array[i]
,并且在某个地方array
实际上定义作为一个数组(而不是像上面那样的指针),那么它会尝试将数组的内容解释为地址。例如,在我们定义为
double array[1] = { 0.0 };
假设0.0
所有位都为零。然后,上面array[1]
上的extern double*
操作将尝试取消引用所有位为零的指针地址。在大多数盒子上,这会崩溃。而对其他人来说,这将导致随机的废话。