2017-01-02 26 views
-3

你好stackoverflow 所以我的問題是:我想做一個函數來生成結構數組,但是當我完成時我得到一個錯誤插入值是什麼問題? 像這樣我想動態地創建一個結構數組,但是我得到一個堆損壞錯誤:

struct INFO 
{ 
    char name[20]; // creating the strucure 
    int age; 

}; 
void generateArr(INFO *p); // a function to generate the array 
void readArr(INFO *p); // a function to read the array 
int main() 
{ 

    INFO *ptr =new INFO; // a pointer that points to the structure 
    generateArr(ptr); // calling the functions 
    readArr(ptr); 
    delete[]ptr; // deallocating memory 

} 
void generateArr(INFO *p) 
{ 
    p = new INFO [3]; // generating three INFO structures 

} 
void readArr(INFO *p) 
{ 
    for (int i = 0; i < 3; i++) 
    { 

     cin >> p[i].name>> p[i].age; // inputting the elements 
     cout << endl; 
    } 

} 

我試圖使代碼儘可能明確,問我如果有什麼不明確。

+0

你會得到什麼錯誤? – tinkertime

+0

您只分配給'generateArr'中的參數。它對外部世界的影響與'void f(int x){x = 0; }'。 – molbdnilo

+0

你在main中爲'ptr'分配內存並嘗試覆蓋'generateArr'中的指針。如果它能夠工作,那將是一次泄漏,但這並不是因爲它是按價值傳遞的。這也是你的程序崩潰的原因,'ptr'只有'readArr'中的1個元素的內存。 – Unimportant

回答

0

此功能:

void generateArr(INFO *p) 
{ 
    p = new INFO [3]; // generating three INFO structures 

} 

如你期望它不能正常工作。它將分配的內存分配給本地「p」參數,該參數不返回給主。要修復它改變p來參考:

void generateArr(INFO *&p) 

[編輯]

但因爲你已經在主分配ptrINFO *ptr =new INFO;,你會得到一個內存泄露這種方式。所以你應該刪除該行。

+0

並在'main'中刪除'= new INFO;',否則會被泄露。 – Unimportant

+0

@不重要的權利,我剛剛更新了 – marcinj

+0

感謝現在一切正常。 –

0

generateArr(INFO *p)中,您分配一個數組,該地址存儲在本地變量p中;在函數返回時,只要分配數組的地址,任何局部變量(如p)都會丟失。

你應該擺脫功能generateArr(INFO *p),這是沒用的,並分配您的陣列到main(),這種方式:

int main() 
{ 
    INFO *ptr =new INFO[3]; 
    readArr(ptr); 
    delete[]ptr; // deallocating memory 
} 
+0

完成了,感謝您的輸入 –

0

重寫的功能至少包括以下方式

INFO * generateArr(size_t n) 
{ 
    return new INFO [n]; // generating three INFO structures 
} 

void readArr(INFO *p, size_t n) 
{ 
    for (int i = 0; i < n; i++) 
    { 

     cin >> p[i].name>> p[i].age; // inputting the elements 
     cout << endl; 
    } 
} 

,並在主叫他們像

const size_t N = 3; 

INFO *ptr = generateArr(N); // a pointer that points to the structure 
readArr(ptr, N); 
delete []ptr; // deallocating memory 

至於你的代碼,然後在此聲明

INFO *ptr =new INFO; // a pointer that points to the structure 

但它是使用,而不是運營商delete的操作delete []刪除分配有隻有一個結構類型的對象。

delete[]ptr; // deallocating memory 

而這個函數內部

void generateArr(INFO *p) 
{ 
    p = new INFO [3]; // generating three INFO structures 
} 

存在內存泄漏,因爲變量p是由函數的參數的值進行初始化,並且將在退出後銷燬的函數的局部變量功能。結果動態分配的內存地址將會丟失。

相關問題