这是指针吗?(如果是,它是如何初始化的?)
Is this a pointer? (And if so, how was it initialized?)
有一个头文件esUtil.h,其中定义了一个名为ESContext的结构,其成员之一是userData。userData是指向void的指针。
使用它的程序的主体是这样的,简单地说:
#include "esUtil.h"
typedef struct {
GLuint programObject;
} UserData;
int DoSomething(ESContext *esContext) {
UserData *userData = esContext->userData;
...
}
int main(int argc, char *argv[]) {
ESContext esContext;
UserData userData;
esStart(&esContext);
esContext.userData = &userData;
...
if(!DoSomething(&esContext))
return 0;
...
}
我被语句中的"*userData"弄糊涂了:userData*userData=esContext->userData;
如果它是一个指针,那么它是如何在没有声明的情况下产生的。谢谢你的解释。
是的,它是一个指针。线路
UserData *userData = esContext->userData;
声明一个名为userData
、类型为UserData *
(指向UserData
的指针)的变量,并使用值esContext->userData
对其进行初始化。
在代码中,ESContext的成员userData可能用结构userData初始化,这就是为什么它被分配给DoSomething函数中的userData指针。
它可能是一个空指针,但仍然可能包含UserData对象的地址
userData
实际上是一个指针。它被声明为指针类型(类型名称中的星号是一个提示),并且这段代码可能会编译,所以它必须是指针类型。除非你没有发布的任何代码(主要)涉及userData
,否则userData
是未初始化的。
你会问"它是如何在没有初始化的情况下产生的。"好吧,在主流的C/C++实现中,指针实际上只是整数,其大小等于系统上的字大小(32位系统上为32位,64位系统中为64位)。如果取消引用指针,CPU将指向指针所代表的地址,并获取相关数据。如果数据不在那里,如果你幸运的话,你的程序会发出嘎嘎声(在*nix,segfault上),如果你不幸运的话会做一些奇怪的事情。在这种情况下,main的userData
被声明,所以数据实际上就在那里。但是,它没有初始化,所以userData
的内容可以是任何内容。只要DoSomething
不使用userData
的内容,就可以了,因为它只是在操纵那个地址。但是,如果它试图取消引用userData
,CPU将耗尽内存并拉入垃圾,在这一点上,程序可能会做各种奇怪的事情,因为userData
中的任何位模式都是可能的,所以对userData
的任何计算都可能得到各种不同的结果。
C/C++语言规范说,使用未初始化的值会产生未定义的行为,实际上是未定义的,这意味着编译器可以插入代码来擦除你的硬盘,或者向Kernighan和Ritchie发送威胁消息,或者在你使用未初始化值时做任何它喜欢的事情。但真正的编译器生成的代码只是给出了垃圾位模式(通常是以前函数调用中剩下的堆栈数据)。因此,虽然使用未初始化的值是错误的,但它不会杀死你。
所有这些关于未初始化的值和坏指针的奇怪之处是C和C++是不安全语言的最明显的方式之一。Eric Lippert在这里解释了C和C++不安全的另一种方式。
它是一个指针,由以下行初始化:
esContext.userData = &userData;
- 在C++中,如果成员引用在其声明中初始化,为什么需要存储空间?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- 在C++中加载火炬脚本模型:如果没有ATen_cuda库,则无法初始化 CUDA
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 初始化原子指针是原子的吗?如果初始化或内存分配引发,会发生什么情况?
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 如果构造函数被显式默认或删除,为什么聚合初始化自 C++20 以来不再起作用
- 如果值来自成员变量,则复制初始化和参考初始化之间的C 差异
- 如果变量未初始化,Visual Studio 2017 不会生成任何警告
- 如果初始化需要shared_from_this,如何在一次调用中构建一个类
- 如果明确默认的constexpr ctor允许非constexpr初始化
- 如果静态成员未初始化并且成员类型是类本身,该怎么办?
- 如果有默认成员初始化,为什么要使用成员初始化列表
- 从C++调用 Python 类方法,如果给定一个初始化的类作为 PyObject
- 如果仅在 lambda 中使用,则不会在发布版本中初始化局部静态变量
- 新标准中对memcpy生命周期初始化规则有哪些更改(如果有的话)
- 如果结构作为递归函数中的参数传递,如何初始化结构的成员变量