我有以下代码指向结构数组的代码,但我无法使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;
}
答案 0 :(得分:3)
您的代码存在的问题是
char
应为char*
名称insert
功能更改为pdata insert ( int n , tdata *array )
(*array)[i].key
更改为array[i].key
return array;
)tdata* pdata
等语句,而不仅仅是pdata data
。insert
来电更改为main
至insert(n, data);
在此处运行示例: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个提示:
char
应为char*
名称insert
功能更改为pdata insert ( int n , tdata *array )
(*array)[i].key
更改为array[i].key
return array;
)tdata* pdata
等语句,而不仅仅是pdata data
。insert
来电更改为main
至insert(n, data);
答案 2 :(得分:0)
代码的问题是MinGW工具链,安装错误。我重新安装它,它工作。谢谢你的回答
答案 3 :(得分:-1)
我认为这个错误是你正在使用指向结构数组的指针,这是一个数组数组。你不想要这个。
当您像这样传递数组时,您基本上是将指针传递给数组的开头。 (您必须单独传递大小。在类中,您可以封装它,但您的版本几乎是原始C。)
更改为
pdata insert ( int n , tdata *array )
请注意括号已消失。