0

我试图理解一部分代码。我省略了很多代码,以使其更易于解释,并避免不必要的混淆。

typedef void *UP_T;

void FunctionC(void *pvD, int Offset) {
    unsigned long long int temp;
    void *pvFD = NULL;

    pvFD = pvD + Offset;
    temp = (unsigned long long int)*(int *)pvFD;
}

void FunctionB(UP_T s) {
    FunctionC(s, 8);
}

void FunctionA() {
    char *tempstorage=(char *)malloc(0);
    FunctionB(tempstorage);
}

int main () {
    FunctionA();
    return 0;
}

就像我说的,我遗漏了大量代码,因此这些函数看起来毫无用处,因为它们只有两行代码。

是什么temp?这就是让我感到困惑的地方。当我运行与此代码类似的东西并printf()沿途使用语句时,我得到一个随机数pvD,并且pvFD是该随机数加八。

但是,我也可能错误地打印了值(使用%llu而不是%d,或类似的东西)。我很确定它是指向内存中tempstorage加 8 位置的指针。这是正确的吗?在我继续这个假设之前,我只想确定一下。

4

2 回答 2

3

该标准指定malloc(0)返回 NULL 或有效指针,但该指针永远不会被取消引用。实际实现没有任何限制,因此您不能依赖返回的指针是另一个加 8。

于 2012-12-31T14:42:06.550 回答
1

它在某种意义上是随机的,malloc通常是不确定的(即每次运行都会给出不同的结果)。

结果malloc(0)是实现定义的(但完全有效),你永远不应该取消引用它。您也不应该尝试对其进行算术运算(但这通常是正确的;您不应该使用算术来创建超出分配内存范围的指针)。但是,调用free它仍然可以。

于 2012-12-31T14:39:59.943 回答