Проблема возвращается char *
.Когда вы используете C ++, вы не должны использовать этот тип.Это не С!std::string
или std::vector<char>
следует использовать.
Если вы будете использовать char *
в качестве типа возврата в этом типе функции, это приведет к неопределенному поведению (доступ к освобожденной памяти) или утечке памяти.
Если вы будете использовать static std::string nam;
, функция будет поддерживать внутреннее состояние, и это всегда приводит к проблемам.Например, если вы создадите функциональность потоков, у вас будет неопределенное поведение.Еще хуже, если вы по какой-то причине будете использовать эту функцию дважды, результат второго вызова будет влиять на результат для первого вызова (например, ваш коллега будет использовать эту функцию, поскольку он не будет ожидать скрытых побочных эффектов).
ЕслиВы разрабатываете некоторый API, который должен быть доступен из кода C, чем вы должны разрабатывать этот API другим способом.Я не знаю, какую функциональность вы предоставляете, скорее всего, вам нужно что-то вроде этого:
char *func1(someStruct* pt, char *result, int size){ // good name could be like this: appendStructDescription
std::strig nam = somefunc(pt);
//have to append some integer in particular format
std::stringstream ss;
ss<<nam<<pt->int1 ......;
nam = ss.str();
int resultSize = std::min(size - 1, nam.length());
memcpy(result, nam.c_str(), resultSize);
result[resultSize] = 0;
return result + resultSize;
}
Этот подход имеет большие преимущества: ответственность за управление памятью переходит к вызывающей стороне, пользователь API понимает, чтоожидается.