Objective c 在Unix中使用double?
我调用了Objective c 在Unix中使用double?,objective-c,c,macos,unix,Objective C,C,Macos,Unix,我调用了sysctl()来检索mem stats,对于void*oldVal参数,我传递了一个指向double的指针。但是,它没有将double设置为正确的值,而是将其设置为0.00000 但是,当我尝试使用long做完全相同的事情时,它会将其设置为正确的统计。为什么double设置为0.00000,而long设置为正确的统计 int systemInfoNeeded[2] = {CTL_HW, HW_PHYSMEM}; size_t sizeOfBuffer = sizeof(
sysctl()
来检索mem stats,对于void*oldVal
参数,我传递了一个指向double的指针。但是,它没有将double设置为正确的值,而是将其设置为0.00000
但是,当我尝试使用long做完全相同的事情时,它会将其设置为正确的统计。为什么double设置为0.00000,而long设置为正确的统计
int systemInfoNeeded[2] = {CTL_HW, HW_PHYSMEM};
size_t sizeOfBuffer = sizeof(totalAmount);
if (sysctl(systemInfoNeeded, 2, &totalAmount, &sizeOfBuffer, NULL, 0))
{
NSLog(@"Total memory stat retrieval failed.\n");
exit (EXIT_FAILURE);
}
总数是双倍。第二次我把totalAmount的类型改为long,它工作得很好。我能让替身上班吗?我想直接发送totalAmount
,而不是发送一个long,然后将值赋给totalAmount
我在Mac OS X Snowleopard上使用Objective-C/C,Xcode为3.2.6您不能只选择您喜欢的数据类型并传递指向它的指针;sysctl调用需要一个指向整数的指针,因此您必须提供这个指针。如果将指针传递给一个double,则会得到一个double,其中的位表示一个整型值——结果是乱七八糟的。sysctl()接受一个指针,指向在手册页中为要查询的属性指定的类型。该参数被声明为void*,以便相同的泛型接口可以处理各种属性所期望的不同类型。这并不意味着你可以使用任何你想要的类型。在HW_Physem的情况下,它是一个整数,即int,而不是long或其他任何东西 如果传递long,它工作的唯一原因是因为mac是小endian,因此作为long的值的前四个字节与作为int的值相同,但您当然不应该依赖于此 如果要读取双精度,请转换整数
你应该好好看一看。请特别关注KERN_MAXPROC的示例。sysctl不希望指针指向长字符串。它需要一个指向数值变量的指针,这就是为什么它是void*而不是long*。如果我传入一个整数,它仍然可以工作,所以我不明白为什么double不能工作。但不是任何类型的指针,没有办法检查您传入的是什么类型的指针,所以您必须提供一个所需类型的指针。
sysctl(3)
的BSD手册页令人愤怒。为什么不说所谓的“整型”值使用哪种整型?您只是想知道它是long
(与int
相反,它的大小和表示形式不一定与long
相同,因为64位OSX使用LP64),还是想检查每个调用写入的大小,如果它是sizeof(long)
,您可以将数据重新解释为long
,如果是其他大小,请重新解释为其他整数类型?手册页上显示的是“整数”,意思是“整数”。如果是“长整数”,则会显示为“长整数”。请阅读此处的代码以了解应如何操作: