Указатель массива глобальных переменных на C - PullRequest
0 голосов
/ 18 февраля 2011

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

Я создаю массив следующим образом:

void initPQueue()
{
    EventPTR pQueue[qSize];
    int i;
    float t;
    for(i = 1; i < qSize; i++)
    {
        t = getNextRandomInterval(getL());
        pQueue[i] = createEvent(t); 
    }

    setpQueue(pQueue);
    buildpQueue();

}

Я использую setpQueue (pQueue) для установки глобальной переменной .... вот так ...

void setpQueue(EventPTR* pQueue)
{
    pQueuePTR = pQueue;
}

Глобальная переменная объявлена ​​как:

EventPTR* pQueuePTR;

Вот моя структура: (в моем .h файле .. atm)

struct event {
    float eTime;
    double sTime;
    int status;
};

typedef struct event Event;
typedef struct event* EventPTR;

До этого момента все было прекрасно. Мой buildpQueue даже работает правильно ... с использованием pQueuePTR .... однако ... Я решил создать несколько тестовых функций, чтобы просто вывести массив pQueue, и вот где он стал уродливым ...

void outTest()
{
    int i;
    printf("\n\n");
    for(i = 0; i < qSize; i++)
    {
        if(pQueuePTR[i] != NULL) printf("%f ", pQueuePTR[i]->eTime);
        else printf("NULL ");

    }
}

Это дает мне вывод, как указатель на массив содержит нулевые значения, когда он не ... эта функция и последние две находятся в одном файле. Я даже поместил этот цикл в setpQueue, и он работал нормально ... как и должно быть в outTest ...

Я не понимаю, почему это может сделать это ... поэтому я пришел спросить экспертов ...:)

Любая помощь будет отличной ...:)

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011

В initPQueue () pQueue выделяется в стеке;как только эта функция вернется, эта память больше не будет действительной.

Чтобы данные выдержали вызов функции, вам нужно разместить их в куче с помощью malloc () (или какой-либо другой функции выделения памяти).

2 голосов
/ 18 февраля 2011

После завершения initPQueue ваша очередь больше не будет существовать (поскольку она является локальной переменной).

...