Динамическое выделение памяти на стеке

Вы рассмотрели просто Систему использования. Рисование пространства имен? Например:

System.Drawing.Color color = System.Drawing.Color.FromArgb(red, green, blue);
float hue = color.GetHue();
float saturation = color.GetSaturation();
float lightness = color.GetBrightness();

Примечание, что это не точно, что Вы попросили (см. , различия между HSL и HSV и Цветным классом не имеют преобразования назад из HSL/HSV, но последний обоснованно легок добавить .

5
задан Deduplicator 21 February 2015 в 17:37
поделиться

6 ответов

Допустима ли такая операция?

Она называется массивом переменной длины.

VLA разрешены в ANSI C99 и в качестве расширения некоторых компиляторов до C99. GCC поддерживает его как строгий C99 и как расширение кода, отличного от C99. Это также законно в C ++ 0x.

Если нет, то почему компилятор не выдает никаких предупреждений или ошибок?

С gcc:

$ gcc -std=c89 src/vla.c  -Wall -ansi -pedantic
src/vla.c: In function ‘function’:, not dynamic array.
src/vla.c:17: warning: ISO C90 forbids variable length array ‘a’
src/vla.c:21: warning: ISO C90 forbids mixed declarations and code

Наличие 'conio.h' из MSDOS указывает на то, что вы, вероятно, используете компилятор Microsoft Visual C ++, поэтому не не волнуйся об этом. MS работала над тем, чтобы сделать свой компилятор более совместимым со стандартом C ++ 0x, но не заявляет о том, насколько стандартен его режим компилятора C. Вы спрашиваете, почему слова испанского диалекта отсутствуют во французском словаре.

Где будет размещена эта память: стек или куча?

Это автоматический объект, поэтому большинство реализаций C будут помещены в стек из соображений эффективности.

Почему ANSI C / GCC позволяет это

Это полезно для создания временных массивов переменного размера во время выполнения, время жизни которых не выходит за рамки вызова функции.

14
ответ дан 18 December 2019 в 06:23
поделиться

Это верно C99 .

См. здесь для более подробного объяснения в другом вопросе StackOverflow.

10
ответ дан 18 December 2019 в 06:23
поделиться

Массивы переменной длины недопустимы в ANSI C (C89). Попробуйте повысить уровень предупреждений вашего компилятора, и я уверен, что вы получите предупреждение / ошибку.

0
ответ дан 18 December 2019 в 06:23
поделиться

Код действителен, но при использовании массивов переменной длины следует помнить об одном:

void function(int i)
{
     int a[i];
     .
     .
}

Здесь нет проверки ошибок. Этот код может завершиться ошибкой, если i слишком велик.

0
ответ дан 18 December 2019 в 06:23
поделиться

Это допустимо, но не все компиляторы поддерживают его. По крайней мере, Visual Studio <= 2003 afaik не поддерживает его.

Я бы предположил, что это не Ansi C ++, попробуйте gcc -ansi -pedantic.

1
ответ дан 18 December 2019 в 06:23
поделиться

Динамическое выделение памяти на стеке:

Существует библиотечный вызов _malloca, который динамически выделяет память на стеке программы (очень похоже на то, что malloc делает на Heap)

Ссылка: _malloca

0
ответ дан 18 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

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