2011-07-15 77 views
-2

一个函数的最后两行如何能够ç传递无符号long long值

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; 
+3

我们是否需要猜测其余代码中没有显示给我们的内容?例如谜题中所有参与者的类型声明。如果你认为它不值得包括那些,那么我会说你需要看看没有进一步。您的任务是了解C中类型的重要性。 –

+1

如何声明'disk_free_blocks'? – cnicutar

+1

明显的问题,但你的disk_free_blocks的返回类型被定义为'unsigned long long'? – dolphy

回答

0

议决

disk_free_blocks()住在不同的文件比process_copy_out(),使得调用disk_free_blocks功能。

的修复程序添加函数原型告诉编译器。

谢谢大家的帮助。

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位值压入堆栈,这在%llu格式代码的可变参数printf处理期间检索和正确打印。

+1

+1,数学再次出现 – dolphy

+0

+1,十六进制数字确实很明显。打的好。 – Coeffect

+0

unsigned long long disk_free_blocks(char * disk,int option){ –

1

返回值被截断沿途某处32位。或许disk_free_blocks被宣布为返回int

+0

unsigned long long disk_free_blocks(char * disk,int option){ –