[英]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;
}
您的代码的问题是
char
应为名称的char*
insert
函数更改为pdata insert ( int n , tdata *array )
(*array)[i].key
更改为array[i].key
return array;
) tdata* pdata
语句,而不仅仅是pdata data
。 insert
main
的insert
调用更改为insert(n, data);
在此处运行示例: 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条提示:
char
应为名称的char*
insert
函数更改为pdata insert ( int n , tdata *array )
(*array)[i].key
更改为array[i].key
return array;
) tdata* pdata
语句,而不仅仅是pdata data
。 insert
main
的insert
调用更改为insert(n, data);
代码的问题是MinGW工具链,安装错误。 我重新安装了它,并且工作了。 谢谢您的回答
我认为错误是您正在使用指向结构数组的指针,该指针是数组的某种形式。 你不要这个
当您像这样传递数组时,基本上就是在传递指向数组开头的指针。 (您必须分别传递大小。在一个类中,您可以对此进行封装,但是您的版本几乎是原始的C。)
改成
pdata insert ( int n , tdata *array )
请注意括号已消失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.