一个函数的最后两行怎么可能
printf("disk_free_blocks returning %llu\n",item_int3);
return (item_int3);
和输出
disk_free_blocks 返回 233012428800
返回调用函数
part_avail=disk_free_blocks(DiskParts[part_index].part_name,DISK_AVAIL);
if (DEBUG) printf("DiskParts[%d].part_name=%s has %llu free.\n",part_index,DiskParts[part_index].part_name,part_avail);
输出为
DiskParts[0].part_name=/dev/sda1 有 1084194816 个可用空间。
??
unsigned long long part_avail, item_int3;
最佳答案
两个输出数字是:
0x00000036409F8000
和
0x409F8000
返回类型(您尚未显示)似乎不够大,无法容纳 64 位值,因此编译器只是截断(这是标准所需的行为,用于缩小无符号数的转换范围)整数)。
<小时/>我倾向于认为这些都是错误的:2330 亿个 block ,其中一个 512 字节 block ,即 100 TB。不见得。 10 亿个 block 大约为 512 GB,这可能与您的实际 /dev/sda1
可用空间匹配,也可能不匹配。
unsigned long long part_avail, item_int3;
这是没有意义的,因为这两个变量的使用范围不同。是否有两个同名的变量?或者您使用全局变量吗?
函数内的 item_int3
可能只有 32 位,printf
在 vararg 处理期间读取参数列表的末尾,而堆栈恰好有 0x00000036
,以便由 %llu
说明符打印出来。当以 unsigned long long
形式返回时,编译器会正确地对值进行零扩展,然后调用者将完整的 64 位值压入堆栈,该值在 printf 期间正确检索并打印
vararg 处理 %llu
格式代码。
关于c 传递 unsigned long long 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6712244/