在Unix中使用双打?

时间:2012-02-13 23:17:17

标签: objective-c c macos unix

我正在调用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

2 个答案:

答案 0 :(得分:3)

您不能只选择自己喜欢的数据类型并将指针传递给它; sysctl调用需要一个指向整数的指针,这就是你必须提供的。如果你将一个指针传递给一个double,那么你会得到一个带有位的double,它将一个值表示为一个整数 - 结果是乱码。

答案 1 :(得分:1)

sysctl()接受指向您正在查询的属性在联机帮助页中指定的类型的指针。该参数声明为void *,因此相同的通用接口可以使用各种属性所期望的不同类型。这并不意味着您可以使用任何您想要的类型。在HW_PHYSMEM的情况下,它是一个整数,即int,不是long或其他任何东西。

如果传递long,它的唯一原因是因为mac是小端,因此一个值的前四个字节作为long与作为int的值相同,但你当然不应该依赖于此

如果要读取double,请转换整数。

你应该好好看看sysctl(3)。请特别注意KERN_MAXPROC的示例。