这是一个非常基本的问题,但我一直在寻找无处可寻的答案。
请考虑以下代码:
myFunction(MyObject** obj) {...}
int main()
{
MyObject *obj = NULL;
myFunction(&obj);
}
这是什么结果?
&obj
是否为空?未定义?它是否存在段错误?
答案 0 :(得分:5)
不,&obj
不会为NULL,
它将是保存obj"的值的内存地址,指向MyObject的指针。
它就像
int x = 0;
int *ptrTox = &x;
在这种情况下,ptrTox将包含x的地址,而不是零。它可以是任何有效的地址。
答案 1 :(得分:4)
指针只是一个存储地址的变量(对该地址的类型有约束)。
因此,虽然它存储了一个地址,但它在内存中也有自己的地址。
在您的情况下,&obj
是此变量的地址,既不是NULL
也不是未定义,访问它不会发生段错误(如果您不使用{{1}执行操作那显然需要访问所指出的内容。实际上,变量obj
在您的代码中声明和定义。
答案 2 :(得分:0)
你的myFunction()获取了obj的地址(作为传递& obj)。您已经创建了一个名为obj的MyObject类的指针。所以它不应该是空的。其中包含obj指针的内存地址。
这里描述了Segfault What is a segmentation fault?