无法使指针结构数组起作用

时间:2014-03-17 19:58:04

标签: c++ arrays data-structures

我有以下代码指向结构数组的代码,但我无法使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)

感谢任何帮助。

正如有些人问的那样,我已经写了一个主()。这是:

    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;
}

4 个答案:

答案 0 :(得分:3)

您的代码存在的问题是

  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(n, data);
  7. 使用malloc释放为阵列分配的内存(免费呼叫)。
  8. 一旦这样做,您将停止获得运行时错误。
  9. 在此处运行示例:http://ideone.com/FsFgCs

答案 1 :(得分:1)

这里省略了一个return语句:

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

        }
    }   

非void 函数中省略return语句[main()除外)并使用代码中返回的值调用 Undefined Behavior

  

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

     

带表达式的return语句只能在函数中使用   返回一个值;表达式的值返回给   函数的调用者。如果需要,表达式是隐式的   转换为它出现的函数的返回类型。一个   return语句可以涉及临时的构造和复制   object(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(n, data);
  7. 使用malloc释放为阵列分配的内存(免费呼叫)。

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

我认为这个错误是你正在使用指向结构数组的指针,这是一个数组数组。你不想要这个。

当您像这样传递数组时,您基本上是将指针传递给数组的开头。 (您必须单独传递大小。在类中,您可以封装它,但您的版本几乎是原始C。)

更改为

 pdata insert ( int n , tdata *array )

请注意括号已消失。