函数返回一些指针为NULL

时间:2015-11-20 16:04:43

标签: c function pointers

我有以下数据结构:

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)

创建堆栈结构并在堆栈的“m_intArray”字段中调用VectorCreate。当我从main调用StackCreate时,我看到函数内部的调试器,一切正常,并且为所有三个指针分配了内存(指向堆栈的指针,指向vector的指针和指向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

当函数结束并将堆栈指针返回main时,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

我似乎无法找到它发生的原因,在这种情况下几乎无能为力。从来没有遇到它,将非常感谢你的帮助。

继承人堆栈创建

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;
    }
}

1 个答案:

答案 0 :(得分:1)

看起来你正在返回错误的指针。注意在第一个GDB段中,堆栈指针是0x603010,但在第二个段中,它是0x603030,它是第一个块中的向量指针。