如何解决在 Linux Debian 上,从指针计算 C 中的堆栈内存大小?
受 this related SO answer 的启发,我试图在 Linux Debian 9 上获取堆栈内存使用情况(与堆内存不同),但没有取得多大成功。我创建了一些不会产生预期结果的测试代码:
size_t top_of_stack = 0;
int main(void) {
int x = 0;
top_of_stack = (size_t) &x;
printf("Top of stack in main(): %lu\n",top_of_stack);
int y = 0;
size_t ss1 = (size_t) &y;
printf("Top of stack in main() ss1: %lu\n",ss1);
printf("Diff in main() top - ss1: %lu\n",top_of_stack - ss1);
long z = 0;
size_t ss2 = (size_t) &z;
printf("Top of stack in main() ss2: %lu\n",ss2);
printf("Diff in main() ss1 - ss2: %lu\n",ss1 - ss2);
double dd1[100];
dd1[99] = 12.0;
dd1[98] = 121.0;
dd1[97] = 122.0;
size_t ss3 = (size_t) &(dd1[99]);
printf("Top of stack in main() ss3: %lu\n",ss3);
printf("Diff in main() ss2 - ss3: %lu\n",ss2 - ss3);
return 0;
}
打印输出:
Top of stack in main(): 140733255163788
Top of stack in main() ss1: 140733255163784
Diff in main() top - ss1: 4
Top of stack in main() ss2: 140733255163776
Diff in main() ss1 - ss2: 8
Top of stack in main() ss3: 140733255163768
Diff in main() ss2 - ss3: 8
在三个“差异”打印输出中,只有第一个看起来是正确的。第二个没有说明已经创建了两个 long
变量(long z
和 size_t ss1
)的事实,而不是一个。第三个“差异”报告没有考虑到已创建 100 doubles
的数组,并为最后三个项目分配了值。
如何才能做到这一点?
请注意,虽然我可以在系统中包含“alloc.h”标头,但 stackavail()
函数不可用。这就是我尝试开发自己的解决方案的原因。
解决方法
C 不对堆栈布局做出任何保证。就编译器而言,只要不影响可观察行为,它就可以以任何方式添加或删除变量。它还可以以任何想要的方式引入填充。
我不知道有什么方法可以准确地做到这一点。但是如果您只需要一个不需要在运行时计算的快速估计,只需将所有局部变量相加即可。它不会是准确的,并且可能由于填充和其他东西而略低于实际值。
但是比较指针是个坏主意。如果你有两个指针,void *p,*q;
那么操作 p-q
是没有意义的,除非 p
和 q
指向同一个对象。该操作实际上很可能会调用未定义的行为。 This answer 对此进行了解释。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。