【问题标题】:Passing arrays to functions by their names in C在 C 中按名称将数组传递给函数
【发布时间】:2010-12-14 13:46:04
【问题描述】:

我在我的程序中声明一个全局变量:

double mat[3200][3200];

当通过使用变量名作为参数将此数组传递给 fwrite() 时,我在运行时抛出堆栈溢出。

fwrite(mat, sizeof(double), 3200*3200, fid);

这是为什么呢?编译器不应该将变量 mat 替换为指向其第一个元素的指针吗?

我已经阅读了herehere,但仍然无法理解。

【问题讨论】:

  • 包含初始化数组的代码并调用fwrite()

标签: c function arguments


【解决方案1】:

堆栈溢出错误可能是由于无限递归(在您的示例中不太可能)或堆栈上传递的数据过多(参数)。看来您的数组是通过副本传递的,而不是通过地址传递的。

您可以尝试将调用替换为

fwrite(&(mat[0][0]), sizeof(double), 3200*3200, fid);

静态数组不是指针。

【讨论】:

  • 嗨 jv42,这正是我的问题:为什么我的数组是按值传递的?您的解决方案是一个很好的解决方法。
  • 嗯,这是从 C 语言规范中引用的内容。静态数组(即固定大小的数组)不等同于指向其第一个元素的指针,C 编译器对它的处理方式不同。
  • 您确定这种区别吗? AFAIK,每当数组变量被称为右值时,它的名称都会转换为指向第一个元素的指针。不幸的是,我手头没有 C 标准的副本来挖掘它。
  • 嗯,我很确定,这是一个常见的错误。 C中有两种数组结构。
【解决方案2】:

数组是在栈上创建的吗?比如,你是这样创建数组的吗?

void foo()
{ 
  double mat[3200][3200];

  // ... other stuff

  fwrite(mat, sizeof(double), 3200*3200, fid);
}

如果是这样,您确定是fwrite 而不是数组声明本身导致了堆栈溢出吗?该数组占用 3200*3200*8 = 81920000 字节(约 78 MiB),对于堆栈分配来说可能有点太大了。改用malloc'ing 数组。

【讨论】:

  • 您好 Praetorian,该变量是全局的,即在最外层范围内声明,我相信它是在堆栈上分配的。
  • 全局变量应该在静态存储中,不在堆栈中。所以这不是问题。
  • @liorda:全局数据不是在栈上创建的,而是在一些实现定义的部分中创建的,例如.bss.data。当您说最外层范围时,您是指在main() 或其他函数内,还是在文件级别的任何函数之外?
  • @Karl,我在调用 fwrite() 之前正在读写 mat(结果都很好),所以声明不是问题,我从 windows 得到的异常是“堆栈溢出”,所以我不知道还有什么可能:/
  • OP 指定了“全局变量”,所以没有在栈上定义。
【解决方案3】:

我猜这个变量是按值传递的(使用堆栈)。感谢任何人试图帮助我解决这个问题。

【讨论】:

    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2013-06-26
    • 2014-06-28
    • 1970-01-01
    相关资源
    最近更新 更多