一个函数的最后两行如何
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;
答案 0 :(得分:5)
两个输出数字是:
0x00000036409F8000
和
0x409F8000
似乎返回类型(你没有显示)不足以容纳64位值,因此编译器只是截断(这是标准所要求的行为,用于缩小无符号的转换)整数)。
我倾向于认为这些都是错误的:233亿块,512字节块,即100 TB。不见得。然后,10亿个块大约为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
格式代码。
答案 1 :(得分:1)
沿途某处将返回值截断为32位。也许disk_free_blocks
被声明为返回int
?
答案 2 :(得分:0)
分辨
disk_free_blocks()
位于与process_copy_out()
不同的文件中,该函数调用disk_free_blocks
。
修复程序添加了一个函数原型来通知编译器。
谢谢大家的帮助。