C - 指向int的指针以获取堆栈中的元素

时间:2009-11-02 22:17:43

标签: c stack pointers casting

我想在C中编写标准堆栈,但我不确定我的stk_size()函数是否可以在除我的32位pc之外的其他平台上运行。我读到指向int的指针并不好。 但是什么可以是更好的实施?我不想添加“大小”变量,因为它在我眼中是多余的。

以下是来源的一些部分:

  #define MAX_STACK_SIZE 100

    typedef struct stk stack;

    struct stk
    {
            /* Stack */
            int * stk;

            /* Pointer to first free element of stack */
            int * sp;
    };

    void stk_init(stack* s)
    {
            /* Allocate memory for stack */
            s->stk          = malloc(sizeof(s->stk) * MAX_STACK_SIZE);

            /* Set stack pointer to first free element of stack -> 0 */
            s->sp           = s->stk;
    }

    int stk_size(stack* s)
    {
            return ((int) s->sp - (int) s->stk) / sizeof(int *);
    }

    int main(int argc, char * argv[])
    {
            stack * s;
            stk_init(s);
    }

谢谢!

6 个答案:

答案 0 :(得分:9)

您可以使用(s->sp - s->stk)。减去指针会产生一个ptrdiff_t,这是一个带符号的整数类型。

答案 1 :(得分:5)

首先,你有一个错误。您没有为stack对象分配空间。你想要

int main(int argc, char * argv[])
{
        stack s;
        stk_init(&s);
}

int main(int argc, char * argv[])
{
        stack * s = malloc(sizeof(stack));
        stk_init(s);
}

至于你的问题,我看到@Crashworks在输入时已经回答了它。

答案 2 :(得分:2)

stk_init你应该使用

s->stk = malloc(sizeof(int) * MAX_STACK_SIZE);

因为stkint *。换句话说,您的堆栈由int组成。

stk_size中你应该这样做:

return s->sp - s->stk;

当你在C中减去指针时,C会考虑它们指向的对象的大小(在这种情况下是int)。

这是一个愚蠢的想法,但如果你真的想,你会这样做:((int) s->sp - (int) s->stk) / sizeof(int);

答案 3 :(得分:1)

无需投射,只要你想在ints

中得到答案,就不需要分开
size_t stk_size(stack* s)
{
        return (s->sp - s->stk);
}

答案 4 :(得分:0)

不要将两个指针都转换为int。减去指针并将结果转换为int,unsigned int(如果你知道s-> sp总是> = s-> stk)。这样就不需要除以sizeof(int *)了。

答案 5 :(得分:0)

标准定义的类型intptr_t保证足够大,可以存储int或任何指针类型。使用它。

例如,如果您所在的平台int为32位但指针为64位,则intptr_t将为64位类型。

相关问题