【问题标题】:passing arrays (&) to functions c++, runtime error将数组(&)传递给函数c ++,运行时错误
【发布时间】:2011-10-19 10:22:22
【问题描述】:
#include <iostream>
#include <cmath>
using namespace std;

void input(int(&x)[10]);
int copy(int (&x)[10], int(&y)[10]);
void read(int(&x)[10], int b);


int main()
{
    int m[10], v[10], c; 
    input((&m)[10]);
    read((&m)[10], 10);
    c = copy((&m)[10], (&v)[10]);
    read((&v)[c],c);
    system("PAUSE");
    return 0;
}

void input(int(&x)[10])
{
    for(int i=0; i < 10; i++)
    {
        cout<<"enter number "<<i+1<<": ";
        cin>>x[i];
    }
}

void read(int(&x)[10], int b)
{
    for(int i=0; i < b; i++)
    {
        cout<<"number("<<i+1<<"): "<<x[i];
    }
}

int copy(int(&x)[10], int(&y)[10])
{
    int c = 0;
    for(int i = 0; i < 10; i++)
    {
        if(x[i] % 3 == 0)
        {
            y[c]=x[i];
            c++;
        }
    }
    return c;
}

当我输入第一个数字时出现运行时错误,我们将不胜感激 我认为问题在于我将数组传递给函数的方式,但我不太确定 该程序的目的是在数组 m 中获取 10 个 int-s 的输入,然后将可被 3 整除的那些传递给 v,然后输出两者

【问题讨论】:

  • @skk:在这种情况下无关紧要,因为该程序可能会导致任何事情发生,包括在你的眼球中打开一个微型黑洞。

标签: c++ arrays function


【解决方案1】:
input((&m)[10]);

这并不像你认为的那样; &amp;m 是指向数组的指针,所以 (&amp;m)[10] 是对数组数组的第 10 个元素的引用;换句话说,就是一个无效的内存块,距离m 的末尾有一段距离。

您希望input(m); 传递对m 的引用。

【讨论】:

    【解决方案2】:

    传递数组的语法不正确(尽管它可以编译)。它应该很简单,

    input(m);
    read(m, 10);
    c = copy(m, v);
    read(v, c);
    

    int(&amp;x)[10] 应该用于函数原型,您通过引用接收大小为 10 的数组。调用函数时只需传递变量的名称。

    【讨论】:

    • 然而,有趣的是,如果保持原样,OP 的代码可以编译。我从来不知道。
    • @iammilind: (&amp;m)[10] 是数组数组的第十个元素,因此具有函数的正确类型。
    • @MikeSeymour,是的,我看到了你的答案。但是,m[10](&amp;m)[10] 之间有什么区别,如果两者都是第 10 个元素。后面的语法会创建引用吗?我们可以创建这样的参考吗?
    • @iammilind:两者都是m 的第 10 个元素的情况不是。再次阅读迈克的答案! &amp;m 是一个 int(*)[10],据此类型所知,它指向一个或多个数组,每个数组有 10 个 ints。 OP 只有一个,但(&amp;m)[10] 他试图传递对神话中的第 10 个这样的 10 个ints 数组的引用。这就是它编译的原因; m[10] 不会,因为该函数不接受 int
    • @iammilind: m[10] 是整数数组的十分之一,int 类型的左值。 (&amp;m)[10] 是包含十个元素的数组中的第十个,int[10] 类型的左值(因此可以绑定到对 int[10] 的引用)。其地址与m[100]相同。
    【解决方案3】:

    您传递的是指向函数的指针,而不是引用。

    input((&m)[10]);
    

    在上面的行中,&amp; 正在获取m 的地址,并将其变成一个指针。 这些函数不需要指针。跳过调用中的&amp;,它应该可以工作。

    另外,我建议您尝试查找描述指针和引用之间区别的教程。在 Stack Overflow 上通过 Google 快速搜索出现了 this 问题,并提供了一些很好的答案。

    【讨论】:

      【解决方案4】:

      无效输入(int(&x)[10])

      在这个函数签名中:

      • x 是参数名称
      • int(&amp;)[10] 是参数类型(引用 10 个 ints 的数组)。

      现在考虑一下你是如何调用这个函数的,大概是通过复制/粘贴:

      input((&m)[10]);
      

      对于任何函数调用,你只写一个变量的名字,而不是它的类型;因此,当您将数组传递给函数时,您应该只写:

      input(m);
      

      (由于&amp;的三重含义,目前您正在传递内存中不存在的其他内容。)

      传递[引用]数组的其他地方也是如此。

      【讨论】:

        【解决方案5】:

        将数组传递到 c++ 中不起作用。这将导致运行时错误,除非您使用指针或创建包含数组的类并传递它。

        【讨论】:

          【解决方案6】:

          扩展上面的答案:m[10] 超过了数组中的最后一个元素,所以发生的情况是您正在读取变量之外的内存,这通常被认为是错误的形式。

          【讨论】:

          • OP 没有写m[10]
          猜你喜欢
          • 2011-04-14
          • 1970-01-01
          • 2018-11-14
          • 1970-01-01
          • 2013-06-26
          • 2014-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多