Память, необходимая для хранения матрицы в области действия команды IF, выделяется только внутри этой области? - PullRequest
1 голос
/ 25 апреля 2019

Давайте рассмотрим этот фрагмент кода ниже.

#include <stdio.h>
#define N 100
int main()
{
    int n;

    scanf("%d",&n);

    if(n>0){
        int m[N ][N] = {0};
    }

    return 0;
}

Я хотел бы понять поведение этого кода в отношении памяти.Я хотел бы ответить на следующие вопросы:

  1. Память, необходимая для хранения матрицы m, будет выделена, только если n> 0?Или это выделено в начале программы, независимым способом?
  2. Память, необходимая для выделения матрицы m, будет освобождена в конце области действия if?

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

Как говорит @dbush, код может легально получить доступ к памяти с именем m, находясь внутри области действия if.

То, где выделение будет выполнено, зависит от настроек компилятора и оптимизатора.

Без оптимизации и gcc, и clang корректируют указатель стека (выделяя память) при входе в main, но выполняют инициализацию на ноль, только если n не равен нулю.

При оптимизации -O3 они оба вызывают только scanf и возвращают 0, поскольку это единственные наблюдаемые эффекты. Ни один из компиляторов на самом деле не выделяет память, не просматривает отсканированное значение и не пытается инициализировать.

Доказательства: https://godbolt.org/z/6WRhxz

1 голос
/ 25 апреля 2019

Память, используемая m, действительна только в пределах блока if. Поэтому, если бы вы сохранили указатель на него вне блока, вы бы вызвали неопределенное поведение, если попытались разыменовать этот указатель за пределами блока.

При этом реализация может выбрать выделение стекового пространства для всех локальных переменных независимо от области видимости при вводе функции. Например, если я возьму ваш код и изменим N на 2000, приложение сразу же запустит дамп ядра, как только оно запустится, что означает, что оно пытается выделить место в стеке для слишком большого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...