如何编写一个 return 指向堆栈的指针的函数
How to write a function which return a pointer to the stack
看了下面的,我明白了没有这样的东西存在(至少不'portable')。
然而,我正在关注来自单声道代码库的以下 piece of code,其中 return 一个指向堆栈的指针:
static void *
return_stack_ptr ()
{
gpointer i;
return &i;
}
令我惊讶的是,上面的代码甚至可以在 PowerPC 等 arch 上运行,我原以为这只能在 x86 上运行(也许只能在 gcc 上运行)。
这会在 PowerPC 上运行吗?
栈的作用是支持函数调用和局部变量。如果你的系统有一个堆栈,它将使用它,并在那里分配局部变量。所以假设局部变量的地址指向栈中的某处是非常合理的。这不是特定于 x86 或 gcc - 这是一个相当普遍的想法。
但是,使用指向不存在的变量的指针(即超出范围后)是未定义的行为。所以这个函数不能保证做任何有意义的事情。事实上,"clever" 编译器可以检测到您的程序使用了未定义的行为,并用空操作替换您的代码(并将其称为 "performance optimization")。
或者,"wise" 编译器可以识别您的函数 returns 一个指向堆栈的指针,并使用硬件堆栈指针将其内联。
这两个选项都不能保证 - 此代码不可移植。
看了下面的
然而,我正在关注来自单声道代码库的以下 piece of code,其中 return 一个指向堆栈的指针:
static void *
return_stack_ptr ()
{
gpointer i;
return &i;
}
令我惊讶的是,上面的代码甚至可以在 PowerPC 等 arch 上运行,我原以为这只能在 x86 上运行(也许只能在 gcc 上运行)。
这会在 PowerPC 上运行吗?
栈的作用是支持函数调用和局部变量。如果你的系统有一个堆栈,它将使用它,并在那里分配局部变量。所以假设局部变量的地址指向栈中的某处是非常合理的。这不是特定于 x86 或 gcc - 这是一个相当普遍的想法。
但是,使用指向不存在的变量的指针(即超出范围后)是未定义的行为。所以这个函数不能保证做任何有意义的事情。事实上,"clever" 编译器可以检测到您的程序使用了未定义的行为,并用空操作替换您的代码(并将其称为 "performance optimization")。
或者,"wise" 编译器可以识别您的函数 returns 一个指向堆栈的指针,并使用硬件堆栈指针将其内联。
这两个选项都不能保证 - 此代码不可移植。