我正在调用sysctl()
来检索mem stats和void* oldVal
参数,我传入一个指向double的指针。但是,不是将double设置为正确的值,而是将其设置为0.00000
然而,当我尝试使用long进行完全相同的操作时,它会将其设置为正确的stat。为什么将double设置为0.00000而long设置为正确的stat?
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是一个双倍。第二个我将totalAmount的类型更改为long,它完美地工作。无论如何我可以让双人工作吗?我想直接发送totalAmount
而不是发送一个长号,然后将值分配给totalAmount
。
我在使用Xcode 3.2.6的Mac OS X Snowleopard上使用Objective-C / C
答案 0 :(得分:3)
您不能只选择自己喜欢的数据类型并将指针传递给它; sysctl
调用需要一个指向整数的指针,这就是你必须提供的。如果你将一个指针传递给一个double,那么你会得到一个带有位的double,它将一个值表示为一个整数 - 结果是乱码。
答案 1 :(得分:1)
sysctl()接受指向您正在查询的属性在联机帮助页中指定的类型的指针。该参数声明为void *,因此相同的通用接口可以使用各种属性所期望的不同类型。这并不意味着您可以使用任何您想要的类型。在HW_PHYSMEM的情况下,它是一个整数,即int,不是long或其他任何东西。
如果传递long,它的唯一原因是因为mac是小端,因此一个值的前四个字节作为long与作为int的值相同,但你当然不应该依赖于此
如果要读取double,请转换整数。
你应该好好看看sysctl(3)。请特别注意KERN_MAXPROC的示例。