这是指针吗?(如果是,它是如何初始化的?)

Is this a pointer? (And if so, how was it initialized?)

本文关键字:初始化 如果 指针      更新时间:2023-10-16

有一个头文件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;
相关文章: