2015-11-20 1 views
0

У меня есть следующие структуры данных:функция возвращает некоторые указатели как NULL

struct Stack { 
    Vector* m_intArray; /*vector is stored here*/ 
    int m_numOfElements; 
}; 

struct Vector { 
    int* m_intArray; /*pointer to array of ints, data stored here*/ 
    int m_intArrayCurrentSize; 
    int m_intArrayCapacity; 
    int m_blockSize; 
    int m_initialSize; 
}; 

Вектор структура записывается в другой файл (vector.c) с функцией

Vector* VectorCreate(size_t _initialSize, size_t _blockSize) 

, который создает вектор структуру и выделяет память для массива int в ней. В файле stack.c я написал функцию

Stack* StackCreate(size_t _initialSize, size_t _blockSize) 

, который создает структуру стека и вызывает VectorCreate в поле «m_intArray» стека. Когда я называю StackCreate из главных, я вижу uding отладчика, что внутри функции, все в порядке и есть память, выделенная для всех трех указателей (указатель на стек, указатель на вектор и указатель на INT)

(gdb) p stackPtr 
$11 = (Stack *) 0x603010 
(gdb) p stackPtr->m_intArray 
$12 = (Vector *) 0x603030 
(gdb) p stackPtr->m_intArray->m_intArray 
$13 = (int *) 0x603050 

Когда функция заканчивается и возвращает указатель стека назад к основному, указатель int * имеет нулевое значение.

(gdb) p testStack 
$14 = (Stack *) 0x603030 
(gdb) p testStack->m_intArray 
$15 = (Vector *) 0x603050 
(gdb) p testStack->m_intArray->m_intArray 
$16 = (int *) 0x0 

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

Heres стека Создать

Stack* StackCreate(size_t _initialSize, size_t _blockSize) 
{ 
    if (_initialSize == 0 && _blockSize == 0) 
    { 
     return NULL; 
    } 
    Stack* stackPtr = ((Stack*)malloc(sizeof(Stack))); 
    if (stackPtr == NULL) 
    { 
     return NULL; 
    } 
    stackPtr->m_intArray = VectorCreate(_initialSize, _blockSize); 
    if (stackPtr->m_intArray == NULL) 
    { 
     free(stackPtr); 
     return NULL; 
    } 
} 
+0

Можете ли вы показать код для функций создания? –

+0

Теперь я заметил, что забыл переустановить указатель в функции создания :) Спасибо за помощь! – susdu

ответ

1

Похоже, что возвращается неверный указатель. Обратите внимание, что в первом сегменте GDB указатель стека равен 0x603010, но во втором сегменте это 0x603030, который является векторным указателем в первом фрагменте.

+0

Просто заметил, довольно странно, добавил код создания стека – susdu

Смежные вопросы