簡體   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