我想在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);
}
谢谢!
答案 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);
因为stk
是int *
。换句话说,您的堆栈由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位类型。