我在两个文件中有以下程序
的main.cpp
float POW10[300];
main(0
{
Fill_POW10();
}
Fill.cpp
extern float *POW10;
Fill_POW10()
{
for(int i=0;i<300;i++)
{
POW10[i]=i;
}
}
这与分段错误一起崩溃。当我检查时,POW10为NULL。但是,如果我将Fill.cpp更改为
extern float POW10[];
Fill_POW10()
{
for(int i=0;i<300;i++)
{
POW10[i]=i;
}
}
代码工作正常。我当时认为POW10实际上是作为指向浮点数的指针实现的,所以代码应该是相同的。你能解释一下为什么不是这样吗。
答案 0 :(得分:3)
数组和指针是完全不同的类型。当你定义一个指针变量时,你得到的只是一个指针,它实际上可能指向或不指向任何地方。定义数组时,会得到一个连续的对象序列。
您可能正在考虑函数参数类型,其中数组类型转换为指针类型。也就是说,void foo(int arg[])
相当于void foo(int* arg)
。这仅适用于函数参数。
答案 1 :(得分:1)
POW10的类型是300 float
的数组。它是指向float
的不指针。当您更改extern
声明以匹配定义时问题就会消失。
答案 2 :(得分:1)
答案 3 :(得分:0)
因为链接器没有将float * POW10声明解析为浮动POW10 []定义,但实际上创建了一个单独的定义,最终未初始化(NULL,就像你经历的那样)。