Задать вопрос
Daniro_San
@Daniro_San
Программист

Почему этот код вылетает при запуске?

Я хочу спокойно без лишних велосипедов конвертировать строки в числа и обратно.
Для этого я пишу оболочки для стандартной atof(char*) из stdlib.h и нестандартной функции, расширения gcc, itoa(int, char*, int) из того же stdlib.h
С первой функцией проблем не возникло, а вот со второй пришлось поломать голову.

Вот рабочий пример на C++:
#include <iostream>
#include <cstdlib>

int GetInt( const int  &number )
{
    char *result;
    return itoa(number, result, 10);
}

int main()
{
    std::cout << GetInt( 475); // Все прекрасно работает
}

Но вот подвох - так как функция нестандартная, она просто не будет подключаться если компилировать код c -c++11 или -c++14 .
Возиться с макросами неохота, да и нехорошо, поэтому я просто добавляю в проект файл Numbers.c:
// Numbers.c
#include <stdlib.h>

int GetInt(const int number)
{
    char *result;
    return itoa(number, result, 10);
}


Так как теперь это сишный код, то проблемы с включением itoa теперь быть не должно, и проект можно компилировать с -c++14

Правим main.cpp:
#include <iostream>

extern "C" int GetInt(const int);

int main()
{
    std::cout << GetInt( 475); 
    // Компилируется, но при запуске сразу вылетает
}


Почему все вылетает?
  • Вопрос задан
  • 461 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 2
sfi0zy
@sfi0zy
Creative frontend developer
Я хочу спокойно без лишних велосипедов конвертировать строки в числа и обратно.

Так и конвертируйте, кто вам мешает?
#include <iostream>
#include <string>

int main()
{
    std::string number = "123456";

    int value = std::stoi(number);
    std::cout << value; // 123456 (int)

    std::string number2 = std::to_string(value);
    std::cout << number2; // 123456 (string)
}
Ответ написан
@MiiNiPaa
Ну, вы пишете результат конверсии в память, на которую указывает указатель result. А он указывает... куда?

И чем itos/to_string не угодили? Зачем велосипеды?

EDIT:
так как функция нестандартная, она просто не будет подключаться если компилировать код c -c++11 или -c++14 .
Простите, что?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
petermzg
@petermzg
Самый лучший программист
А память под результат кто выделять будет?
char *result; // не инициализированна
return itoa(number, result, 10);

Для 32 битного числа рекомендуется как минимум 33 байта. И так как вы возращаете результат из функции, то нельзя будет выделять эту память на стеке и поэтому придется далее позаботиться об освобождении выделенной памяти.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы