繁体   English   中英

无法获得指向结构的指针数组

[英]Can't get a pointer-to-structure array to work

我有以下代码指向结构的数组,但无法使Insert函数正常工作

    #include <cstdio>
    #include <cstdlib>
    #include <iostream>

    using namespace std ;

    typedef struct data
    {
        int key ;
        char name[50] ; 
        int year ;
    } tdata ;

    typedef tdata* pdata ;

    pdata create ( int n )
    {
        pdata aux = ( pdata ) malloc ( n * sizeof (tdata ) ) ;
        return aux ;
    }

    pdata insert ( int n , tdata *array[] )
    {
        int i , k ;
        for ( int i = 0 ; i < n ; i ++ )
        {
            cin >> k ;
            (*array)[i].key = k;

        }
    }       

自从我使用指向结构数组的指针以来已经有一段时间了,所以我认为我不太记得它是如何完成的。 当我使用NetBeans / MinGW / MSYS构建此代码时,它可以很好地构建,但是在尝试运行它时出现以下错误:

RUN FAILED(退出值-1,073,741,511,总时间:69ms)

任何帮助表示赞赏。

有人问,我写了一个main()。 这里是:

    int main ( )
    {
        int n ;
        cin >> n ;
        pdata data =create(n);
        data = insert(n, &data);

        return 0;
    }

重要编辑:即使对于一个简单的程序,我也会得到相同的退出失败编号:

int main()
{
    int n;
    cin>>n;
    cout<<n;
    return 0;
}

您的代码的问题是

  1. 您的char应为名称的char*
  2. 将您的insert函数更改为pdata insert ( int n , tdata *array )
  3. (*array)[i].key更改为array[i].key
  4. 您需要从函数中返回修改后的数组(例如return array;
  5. 添加诸如tdata* pdata语句,而不仅仅是pdata data
  6. insert maininsert调用更改为insert(n, data);
  7. 使用malloc释放为数组分配的内存(免费)。
  8. 一旦这样做,您将停止获取运行时错误。

在此处运行示例: http : //ideone.com/FsFgCs

在这里,您将省略return语句:

pdata insert ( int n , tdata *array[] )
    {
        int i , k ;
        for ( int i = 0 ; i < n ; i ++ )
        {
            cin >> k ;
            (*array)[i].key = k;

        }
    }   

非空函数[External main()]中省略return语句,并在代码中使用返回的值将调用Undefined Behavior

ISO C ++-98 [第6.6.3 / 2节]

带表达式的return语句只能在返回值的函数中使用; 表达式的值返回给函数的调用者。 如果需要,则将表达式隐式转换为它所出现的函数的返回类型。 return语句可以涉及临时对象(class.temporary)的构造和复制。 从函数末尾流出就等于没有值的返回; 这导致返回值函数中的行为不确定。

这意味着任何事情都可能发生,包括返回-1,073,741,511。

data = insert(n, &data);  // undefined behavior

但是您的代码还存在其他问题。 Gl Joe给出了可能的解决方案,并增加了第7条提示:

  1. 您的char应为名称的char*
  2. 将您的insert函数更改为pdata insert ( int n , tdata *array )
  3. (*array)[i].key更改为array[i].key
  4. 您需要从函数中返回修改后的数组(例如return array;
  5. 添加诸如tdata* pdata语句,而不仅仅是pdata data
  6. insert maininsert调用更改为insert(n, data);
  7. 使用malloc释放为数组分配的内存(免费)。

代码的问题是MinGW工具链,安装错误。 我重新安装了它,并且工作了。 谢谢您的回答

我认为错误是您正在使用指向结构数组的指针,该指针是数组的某种形式。 你不要这个

当您像这样传递数组时,基本上就是在传递指向数组开头的指针。 (您必须分别传递大小。在一个类中,您可以对此进行封装,但是您的版本几乎是原始的C。)

改成

 pdata insert ( int n , tdata *array )

请注意括号已消失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM