这些extern声明在C ++中有什么区别?

时间:2011-12-18 14:43:26

标签: c++ arrays pointers extern

让我们拥有包含以下内容的文件:

file1.cppdouble array[100];

file2.cppfile1.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?

2 个答案:

答案 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*操作将尝试取消引用所有位为零的指针地址。在大多数盒子上,这会崩溃。而对其他人来说,这将导致随机的废话。