32seph
@32seph

Где располагаются переменные в данном случае (стэк, куча)?

В библиотеке GMP (GNU Multiple Precision) есть определение типа для работы с целыми числами:
typedef struct {
  int _mp_alloc;	
  int _mp_size;
  mp_limb_t *_mp_d;
} __mpz_struct;

typedef __mpz_struct mpz_t[1];

При объявлении переменной типа mpz_t var; внутри функции указатель на структуру будет понятно на стэке, а массив, на который указывает _mp_d, в куче. А где будут размещены _mp_alloc, _mp_size и собственно значение указателя _mp_d? Этот вопрос связан с другим: если функция return (__mpz_struct *)var, то при выходе из нее (и соответственно очистке стэка) не будут ли эти значения перезатерты? Есть ли какие-то гарантии на этот счет в стандарте или это все зависит от реализации компилера?
  • Вопрос задан
  • 456 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Вы совершенно правы. Это массив из одного элемента, и при таком расположении он будет в стеке. Со всеми его полями: alloc, size и mp_d. При выходе из функции есть шансы, что он будет затёрт, и так действовать нельзя.

Кто затрёт? Да кто угодно. Хоть драйвер, пожелавший воспользоваться твоим стеком. Хоть последующий вызов какой-нибудь функции.

С другой стороны, на то и помечена структура __mpz_struct двумя подчерками, чтобы её не использовали.
__mpz_struct* foo()
{
    mpz_t var;
    return (__mpz_struct *)var;
// C:\TestApps\RetLocal\main.cpp|15|warning: address of local variable 'var' returned [-Wreturn-local-addr]|
}


А так работает: всё в куче. Только не забывайте очищать через delete[].
__mpz_struct* bar()
{
    __mpz_struct* var = new mpz_t;
    return var;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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