Проблема в том, что malloc
может вернуть NULL
, если произойдет сбой.В этом случае запись в a->inputs
в следующей строке будет разыменовывать указатель NULL
, который является неопределенным поведением, и его следует избегать.По общему признанию маловероятно, что malloc
потерпит неудачу, но, поскольку вы хотите писать безопасный код, вам следует проверить возвращаемое значение malloc
:
A* a = (A*)malloc(sizeof(A));
if (a != NULL){
a->inputs = inputs;
} else {
/* Handle error */
}
Поскольку вы пишете C ++, исходя из фона C, вы должны знать, что код, который вы пишете, по сути, все еще C и сильно отличается от современного C ++, в котором мы делаем много вещей совсем по-другому.В C ++ есть много очень полезных инструментов и идиом, которые мы хотели бы использовать.
Я предполагаю, что inputs
- это список чисел.В C ++ я бы переписал ваш код следующим образом:
// no typedef
struct A {
vector<double> inputs;
};
// no createA
// Example usage:
int main(){
A a;
// no manual memory management!!!
// no pointers!
// how many inputs?
cout << "There are " << a.inputs.size() << " inputs\n";
// add two inputs
a.inputs.push_back(3.83);
a.inputs.push_back(1.01);
// print everything
for (const auto& input : a.inputs){
cout << input << " ";
}
return 0;
}
Так мы обычно делаем в C ++ в настоящее время.Под капотом происходит много всего, но общий опыт становится очень безопасным и дружелюбным, когда вы знаете, что делаете.Если вам интересно, я бы посоветовал вам выбрать из этот список хороших книг по С ++ и внимательно прочитать.В противном случае, возможно, проще всего придерживаться C, если вам это удобно.