我想了解一部分代码。我遗漏了很多代码,以便更容易解释,并避免不必要的混淆。
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的内存位置的指针。这是正确的吗?在我继续这个假设之前,我只想确定。
答案 0 :(得分:3)
该标准指定malloc(0)
返回NULL或有效指针,但该指针永远不会被解除引用。对实际实现没有任何限制,所以你可以依赖返回的指针是另一个加8。
答案 1 :(得分:1)
malloc
通常是非确定性的(即从运行到运行时给出不同的结果),这是随机的。
malloc(0)
的结果是实现定义的(但非常有效),你不应该取消引用它。你也不应该尝试对它进行算术运算(但这通常是正确的;你不应该使用算术来创建超出分配内存边界的指针)。但是,在其上调用free
仍然没问题。