C程序找到堆栈增长的方向

Nee*_*eel 3 c stack

如何在C中找到堆栈正向或反向进展?这项工作?

int j = 0;
int k = 0;

if (&k > &j) 
 printf ("Stack is growing in forward direction");

else if (&k < &j) 
  printf ("Stack is growing in reverse direction");
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 13

为了可靠,人们必须找到两个函数调用之间的区别.

void func(int *p) {
    int i;
    if (!p)
        func(&i);
    else if (p < &i)
        printf("Stack grows upward\n");
    else
        printf("Stack grows downward\n");
}

func(NULL);
Run Code Online (Sandbox Code Playgroud)

请注意,这不会给出关于C的答案,而是关于编译器的答案.

  • (p &lt;&i)调用未定义的行为。仅当指针指向同一数组或结构内的对象时,才定义将关系运算符应用于指针的结果。 (2认同)
  • @ikegami为什么不使用stdint.h提供的intptr_t或uintptr_t进行比较?因此,您可以使用“else if (((intptr_t) p) &lt; ((intptr_t) &amp;i) )”来代替“else if ( p &lt; &amp;i )”来避免 UB,不是吗? (2认同)

sig*_*ice 6

你不能.在您的代码中,(&k > &j)调用未定义的行为行为.除非指针指向同一数组中的对象(或超出数组末尾的一个对象),否则不会定义与关系运算符的指针比较.

堆栈是否存在取决于您的实现.未定义的行为无法预测实现细节.

ISO C标准甚至没有提到"堆栈"一词.堆栈可能甚至不存在.函数调用用于保存局部变量的内存可能甚至不是连续的.