[英]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.