-1

代码如下所示:

void fUnc(float b){
  //does nothing  
}

float* fInit(void){
  float result[3];
  result[0] = 1.0;
  result[1] = 1.0;
  result[2] = 1.0;

  return result;
}

int main(){
  float* a = new float[3];
  a = fInit();
  fUnc(a[0]);
  printf("%f, %f, %f", a[0], a[1], a[2]);

  return 0;
}

数组元素的值为 -107374176.000000。如果 fUnc(a[0]) [什么都不做] 被注释掉,一切都会很好。有什么问题?

编辑:对代码进行了一些编辑,以便您更好地理解

4

1 回答 1

1

您不能返回这样的原始数组。您fInit()所做的是返回函数返回后失效的某些本地内存的地址。

a在某种意义上,你的then 指向你的内存fInit(),但它不再有效。任何读取元素的尝试都会a[n]导致未定义的行为。

您应该使用标准容器之一,例如,std::vector如果数组的大小是在运行时确定的,或者std::array如果您在编译时知道大小。如果您需要链表,请使用std::list,等等。

所有标准容器都是可复制的(因此是可返回的)。

请参阅http://en.cppreference.com/w/cpp/container

而且,一定要收藏 http://en.cppreference.com/w/。每次你想给自己写一个算法,或者发现自己在调用new时,请查看参考。并获得好书

于 2013-08-10T09:31:38.830 回答