访问外部浮点数组时出错

时间:2013-05-01 17:31:40

标签: c++ scope extern

我在两个文件中有以下程序

的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实际上是作为指向浮点数的指针实现的,所以代码应该是相同的。你能解释一下为什么不是这样吗。

4 个答案:

答案 0 :(得分:3)

数组和指针是完全不同的类型。当你定义一个指针变量时,你得到的只是一个指针,它实际上可能指向或不指向任何地方。定义数组时,会得到一个连续的对象序列。

您可能正在考虑函数参数类型,其中数组类型转换为指针类型。也就是说,void foo(int arg[])相当于void foo(int* arg)。这仅适用于函数参数。

答案 1 :(得分:1)

POW10的类型是300 float的数组。它是指向float指针。当您更改extern声明以匹配定义时问题就会消失。

答案 2 :(得分:1)

首先阅读此条目,解释您的问题:

http://c-faq.com/aryptr/aryptr1.html

然后阅读此后续内容,它解释了数组和指针之间的区别。

http://c-faq.com/aryptr/aryptr2.html

答案 3 :(得分:0)

因为链接器没有将float * POW10声明解析为浮动POW10 []定义,但实际上创建了一个单独的定义,最终未初始化(NULL,就像你经历的那样)。