试图传递数组的指针:
class aaa{
public:
int a ;
int b ;
std::string c ;
};
void abc(aaa* a [])
{
*a = (aaa*)malloc(sizeof(aaa)* 5);
a[0]->c ="ddd" ;
a[1]->c ="ccc" ; //crash
a[2]->c ="eee" ;
}
int main() {
aaa * a;
abc(&a);
cout << "!!!Hello World!!!"<< a++->c << endl;
cout << "!!!Hello World!!!"<< a++->c << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在第二个数组元素赋值我崩溃了.问题出在哪儿?并malloc没有创造足够的空间?
UPD.
void abc(aaa* a [])由于某种原因,我无法更改功能签名.即使看起来不太好,它也不是错误的签名.
我根据recomendations在答案中更新了程序,但我仍然在获取第二个数组元素成员时崩溃:
cout << "!!!Hello World!!!"<< a[1].c << endl;
Run Code Online (Sandbox Code Playgroud)
为什么?我在下面的代码中做错了什么?
struct aaa{
public:
int a ;
int b ;
std::string c ;
};
int abc(aaa* a [])
{
int asize =5;
*a = (aaa*)malloc(sizeof(aaa) * asize);
for (int i;i<asize;i++)
{
a[i] = new aaa();
}
a[0]->c ="ddd" ;
a[1]->c ="ccc" ;
a[2]->c ="eee" ;
return asize;
}
int main() {
aaa * a;
int asize=abc(&a);
cout << "!!!Hello World!!!"<< a[0].c << endl;
cout << "!!!Hello World!!!"<< a[1].c << endl; //crash
cout << "!!!Hello World!!!"<< a[2].c << endl;
for (int i=0; i<asize;i++)
{
cout << "free "<<i<<endl;
a[i].~aaa();
}
free(a);
cout << "end"<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是多方面的:
malloc非POD类型,因此他们的构造函数不运行(灾难性的)free你malloc(坏)malloc完全使用C++(不是时尚)aaa* a[]时,你的意思是aaa** a(有效的,但误导)#includes或命名空间限定符cout和endl(无效的测试用例)这是你的程序应该是什么样子:
#include <vector>
#include <string>
#include <iostream>
class aaa
{
public:
int a;
int b;
std::string c;
};
std::vector<aaa> abc()
{
std::vector<aaa> result;
result.reserve(3);
result.push_back({0, 0, "ddd"});
result.push_back({0, 0, "ccc"});
result.push_back({0, 0, "eee"});
return result;
}
int main()
{
const auto a = abc();
std::cout << "!!!Hello World!!!"<< a[0].c << std::endl;
std::cout << "!!!Hello World!!!"<< a[1].c << std::endl;
std::cout << "!!!Hello World!!!"<< a[2].c << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
或者,保持五个前期元素分配:
std::vector<aaa> abc()
{
std::vector<aaa> result(5);
result[0].c = "ddd";
result[1].c = "ccc";
result[2].c = "eee";
return result;
}
Run Code Online (Sandbox Code Playgroud)
当你编写C++时,我强烈建议忘记你对C的所有了解.
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |