因此,我有一些简单的C代码可创建大小为512字节的缓冲区:
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include <ctype.h>
main(argc, argv)
char *argv[];
{
char line[512];
gets(line);
}
这是否意味着该缓冲区正好为堆栈分配了512个字节?在GDB中,有没有一种方法可以分解已编译的二进制文件,我们可以看到类似的
我尝试通过GDB逐步解决此问题,但是找不到找到这种检查的方法
答案 0 :(得分:0)
您可以签出“ strace”命令行工具。它将列出所有内部系统调用和相应的参数。它还将使您了解正在分配多少内存。
请注意,您应谨慎使用gets,因为它不会检查缓冲区溢出。
在手册页中:
gets()从stdin读取一行到s所指向的缓冲区,直到终止换行符或EOF为止 替换为“ \ 0”。不检查缓冲区溢出(请参见下面的错误)。
答案 1 :(得分:-1)
如果需要,可以使用printf显示内存地址,例如:
#include <stdio.h>
int main() {
char line1[512];
char line2[512];
char line3[512];
printf("line1 ptr: %p\n", line1);
printf("line2 ptr: %p\n", line2);
printf("line3 ptr: %p\n", line3);
long int diff = line3 - line1;
printf("diff between line3 and line1 : %ld\n", diff);
return 0;
}
如果运行该命令,则可能会看到line1,line2和line1的内存位置之间恰好有512个字节,如果编译器选择以此方式将其放置在内存中。