跟随malloc返回的指针(0)

时间:2012-12-31 14:37:58

标签: c variables pointers malloc

我想了解一部分代码。我遗漏了很多代码,以便更容易解释,并避免不必要的混淆。

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是随机数加上8。

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

2 个答案:

答案 0 :(得分:3)

该标准指定malloc(0)返回NULL或有效指针,但该指针永远不会被解除引用。对实际实现没有任何限制,所以你可以依赖返回的指针是另一个加8。

答案 1 :(得分:1)

malloc通常是非确定性的(即从运行到运行时给出不同的结果),这是随机的。

malloc(0)的结果是实现定义的(但非常有效),你不应该取消引用它。你也不应该尝试对它进行算术运算(但这通常是正确的;你不应该使用算术来创建超出分配内存边界的指针)。但是,在其上调用free仍然没问题。