1

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

主文件

    float POW10[300];
    main(0
    {
        Fill_POW10();
    }

填充.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

4 回答 4

3

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

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

于 2013-05-01T17:33:08.297 回答
1

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

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

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

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

于 2013-05-01T17:37:47.923 回答
1

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

于 2013-05-01T17:33:26.480 回答
0

因为链接器没有将您的 float * POW10 声明解析为 float POW10[] 定义,而是实际上完全创建了一个单独的定义,最终未初始化(如您所见,为 NULL)。

于 2013-05-01T17:35:31.423 回答