我試圖建立對物件、陣列和指標的理解。當我編譯我的代碼時,我最終得到了 0xCCCCCCCC。我了解此錯誤可能是由于未初始化的指標造成的。問題是我不知道在哪里或如何。
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
string name;
};
void createPerson(Person* person[]);
int main() {
Person* person[5];
createPerson(person);
for (int i = 0; i < 5; i ) {
cout << person[i]->name << endl;
}
return 0;
}
void createPerson(Person* person[]) {
string n[5] = { "Dwayne Johnson", "Connor McGregor", "SpongeBob","BatMan", "Ash Ketchum" };
for (int i = 0; i < 5; i ) {
person[i]->name = n[1];
}
}
我正在嘗試獲取要顯示的名稱串列。
uj5u.com熱心網友回復:
問題是你有一個 PersonPerson* person[]指標陣列而不是一個人陣列。我修復了代碼并洗掉了指標:
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
string name;
};
void createPerson(Person person[]);
int main() {
Person person[5];
createPerson(person);
for (int i = 0; i < 5; i ) {
cout << person[i].name << endl;
}
return 0;
}
void createPerson(Person person[]) {
string n[5] = { "Dwayne Johnson", "Connor McGregor", "SpongeBob","BatMan", "Ash Ketchum" };
for (int i = 0; i < 5; i ) {
person[i].name = n[i];
}
}
如您所見,我從陣列定義中洗掉了指標。這樣 Person 物件就在堆疊上初始化。以您的方式,指標被初始化,但它們不指向任何東西。這就是為什么你會得到你的錯誤,因為指標懸空。如果你真的想使用一個指標陣列,你必須像這樣初始化這些指標:
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
string name;
};
void createPerson(Person* person[]);
int main() {
Person* person[5];
createPerson(person);
for (int i = 0; i < 5; i ) {
cout << person[i]->name << endl;
//delete person so that we dont leak mem
delete person[i];
}
return 0;
}
void createPerson(Person* person[]) {
string n[5] = { "Dwayne Johnson", "Connor McGregor", "SpongeBob","BatMan", "Ash Ketchum" };
for (int i = 0; i < 5; i ) {
person[i] = new Person();
person[i]->name = n[i];
}
}
順便說一句:我不會以這種方式使用指標。如果您是新手并嘗試了解內容,則可以進行實驗。但是你應該幾乎總是使用 smart_pointersstd::shared_ptr等。接下來要試驗的應該是容器和適當的資料結構。
uj5u.com熱心網友回復:
您正在宣告 的指標陣列Person,但未初始化這些指標。默認情況下,指標可以根據其各自地址中存盤的垃圾值(在本例中為 0xCCCCCCCC)指向某個隨機位置。
解決方案很簡單,只需使用new關鍵字分配一個新記憶體。
此外,由于您使用的new是分配記憶體,因此delete當您不再需要這些指標時,您應該呼叫取消分配記憶體。
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
string name;
};
void createPerson(Person* person[]);
int main() {
Person* person[5];
createPerson(person);
for (int i = 0; i < 5; i ) {
if (person[i] != nullptr)
cout << person[i]->name << endl;
}
for (int i = 0; i < 5; i ) {
if (person[i] != nullptr)
delete person[i];
}
return 0;
}
void createPerson(Person* person[]) {
string n[5] = { "Dwayne Johnson", "Connor McGregor", "SpongeBob","BatMan", "Ash Ketchum" };
for (int i = 0; i < 5; i ) {
person[i] = new Person();
person[i]->name = n[i];
}
}
在 C 中,您也可以使用智能指標代替原始指標。看到這個
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/349709.html
上一篇:結構中指標符號和點符號的混淆
下一篇:修改指標值
