使用malloc为数组获取空间

vic*_*ico -1 c++ malloc

试图传递数组的指针:

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)

Lig*_*ica 6

问题是多方面的:

  1. malloc非POD类型,因此他们的构造函数不运行(灾难性的)
  2. 没事free你malloc(坏)
  3. malloc完全使用C++(不是时尚)
  4. 路过aaa* a[]时,你的意思是aaa** a(有效的,但误导)
  5. 没有#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的所有了解.

  • 为什么?如果你需要预先分配,为什么不只是`std :: vector <aaa> result(3);`首先? (2认同)