Как я могу инициализировать статический указатель в C? - PullRequest
3 голосов
/ 29 января 2010

Я хочу использовать статический указатель в функции для указания количества целых чисел. Число целых чисел еще не известно при программировании, но оно известно во время выполнения до того, как функция будет использована впервые. Поэтому я хочу дать функции параметр n и сказать ей выделить место в памяти для n целых чисел указателю и сохранить это. Однако я узнал, что статические переменные должны инициироваться в их объявлении, и это, похоже, не работает, потому что с одной стороны мне нужно *, чтобы объявить их как указатели, а с другой стороны, мне нужно имя переменной без *, чтобы выделить объем памяти. Каким будет правильное объявление и инициализация для статического указателя? Я пытаюсь сэкономить время, иначе любому компьютеру, который я могу себе позволить, понадобятся годы для моей программы. Когда я узнал, что локальные переменные быстрее глобальных переменных, а указатели иногда быстрее массивов, я экспериментирую с этим. Эта функция используется миллиарды раз даже в небольших тестовых прогонах, поэтому любая идея ускорить ее приветствуется. Использование указателей также должно улучшить совместную работу некоторых функций в программе, но если они локальные и инициализируются каждый раз при вызове функции, я не ожидаю, что она будет очень быстрой.

Ответы [ 3 ]

3 голосов
/ 29 января 2010

Как это:

void foo() {
    static int* numbers = NULL;
    if (numbers == NULL) {
        // Initialize them
    }
}

Будьте готовы к проблемам параллелизма. Почему бы не сделать его глобальным и иметь правильные функции init_numbers () и user_numbers (), чтобы вы могли контролировать, когда происходит инициализация?

1 голос
/ 29 января 2010

Я бы попробовал что-то вроде этого:

void my_proc(int n)
{
    static int* my_static_pointer(0);

    if (my_static_pointer == 0)
    {
        my_static_pointer = malloc(sizeof(int) * n);
    }

    // check the allocation worked and use the pointer as you see fit
}
0 голосов
/ 29 января 2010

Вы можете инициализировать указатель на нуль и использовать его позже.

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