【问题标题】:C++ passing dynamic array element to a functionC ++将动态数组元素传递给函数
【发布时间】:2013-08-10 08:57:59
【问题描述】:

代码如下:

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]) [什么都不做] 被注释掉,一切都会很好。有什么问题?

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

【问题讨论】:

  • new需要什么?
  • 你的代码适用于我的 g++
  • 对我来说,this works as expected
  • 这是出错的实际代码,还是最小化的示例,说明未最小化时出错的代码?
  • 我意识到自您的编辑以来您的问题发生了巨大变化,所有发布的 cmets 和答案均无效。请不要在以后编辑您的问题。

标签: c++ arrays function dynamic arguments


【解决方案1】:

您不能返回这样的原始数组。您的fInit() 所做的是返回一些本地内存的地址,一旦函数返回,该地址就会失效。

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

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

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

http://en.cppreference.com/w/cpp/container

而且,绝对是书签 http://en.cppreference.com/w/。每次您想给自己写一个algorithm,或者发现自己调用new 时,请查看参考。还有get good books

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多