malloc返回的以下指针(0)

malloc返回的以下指针(0),c,variables,pointers,malloc,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(U

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

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
plus 8的内存位置的指针。这是正确的吗?我只是想在继续这个假设之前确定一下。

这是随机的,因为
malloc
通常是不确定的(即,在不同的运行中给出不同的结果)


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

这是随机的,因为
malloc
通常是不确定的(即,在不同的运行中给出不同的结果)


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

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

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

char*tempstorage=(char*)malloc(0)仅返回一个地址,如果它返回一个地址,则无法取消引用。实现定义了
malloc(0)
应该返回地址还是
NULL
。可能重复:一个有用的链接:@GrijeshChauhan:这可能是一个答案。并且是一个很好的答案
char*tempstorage=(char*)malloc(0)仅返回一个地址,如果它返回一个地址,则无法取消引用。实现定义了
malloc(0)
应该返回地址还是
NULL
。可能重复:一个有用的链接:@GrijeshChauhan:这可能是一个答案。这是一个很好的答案“malloc(0)的结果定义得很好”,不。它是实现定义的。“malloc(0)的结果定义得很好”,不。它是实现定义的。不过我对
temp=…
行很好奇。如果pvFD是tempstorage+8在内存中的位置,则将其类型转换为int,然后转换为指针,然后再次类型转换为无符号长整型?@halexh
temp=(无符号长整型)*(int*)pvFD
表示:将
pvFD
地址作为指向
int
的指针。取消引用它本身,以获得一个
int
,然后将
int
向上转换为一个
无符号long
。不过,我对
temp=…
行非常好奇。如果pvFD是tempstorage+8在内存中的位置,则将其类型转换为int,然后转换为指针,然后再次类型转换为无符号长整型?@halexh
temp=(无符号长整型)*(int*)pvFD
表示:将
pvFD
地址作为指向
int
的指针。将其本身解引用以获得
int
,然后将该
int
向上转换为
无符号长