为什么C和gdb输出的东西不一样?
而且有些数据类型大小甚至可以相等?至少是 维基百科 说这些都有不同的数值范围。
我的机器是64位的,为什么C和gdb输出的东西不一样?
#include <stdio.h>
int main() {
printf("int: %d, long int: %d, long long int: %d\n", sizeof(int), sizeof(long int), sizeof(long long int));
}
$ gcc -g test.c
$ ./a.out
int: 4, long int: 8, long long int: 8
$ gdb -q
(gdb) p sizeof(int)
$1 = 4
(gdb) p sizeof(long int)
$2 = 4
(gdb) p sizeof(long long int)
$3 = 8
没有GDB的C代码的输出是由编译器定义的。
这个帖子可以帮助你根据你的机器弄清楚大小。
在64位的windows上,long int的大小是4个字节(像你这样),而在Mac上这种类型是8个字节。
如果你想在编写c代码时获得精确性,你应该使用stdint内置模块中的 "uintX_t "类型。
例如 "int8_t, uint32_t ..."
这样可以确保无论编译器或运行在什么机器上,你都能得到预期的大小。
原生的 "main "类型的大小是依赖于编译器目标的.C标准定义了每个类型的最小尺寸,我引用维基百科的说法。
char的最小尺寸是8位,short和int的最小尺寸是16位,long的最小尺寸是32位,long long必须至少包含64位。int的类型应该是目标处理器工作效率最高的整数类型。
所以,看来gdb在这里假设的机器和你的编译器不同。你有没有把你的调试目标加载到gdb中?我希望大小能匹配。
在64位x86 GNULinux系统上,gdb通常被配置为使用了 i386
架构(32位ABI)的默认情况。
$ gdb -q
(gdb) p sizeof(int)
$1 = 4
(gdb) p sizeof(long)
$2 = 4
(gdb) show arch
The target architecture is set automatically (currently i386)
那是在Debian的WSL系统上。
当你给gdb一个目标文件后,它会适当地调整。
$ file a.out
a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
for GNU/Linux 2.6.32, not stripped
$ gdb -q a.out
Reading symbols from a.out...done.
(gdb) p sizeof(int)
$1 = 4
(gdb) p sizeof(long)
$2 = 8
(gdb) show arch
The target architecture is set automatically (currently i386:x86-64)