繁体   English   中英

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

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

有一个头文件esU​​til.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->userDataesContext->userData初始化。

在代码中的某些地方,ESContext的成员userData可能使用结构UserData初始化,这就是为什么在DoSomething函数中将其分配给UserData指针的原因。

它可能是一个空指针,但仍然可以保存UserData对象的地址

userData确实是一个指针。 它被声明为指针类型(类型名称中的星星是尖尖的),并且该代码可能会编译,因此它必须是指针类型。 除非任何没有用张贴交易代码的userData (主),是userData的初始化。

您问“它是如何在没有初始化的情况下产生的”。 好吧,在主流的C / C ++实现中,指针实际上只是整数,其大小等于系统上的字长(32位系统上为32位,64位系统上为64位)。 如果取消引用指针,则CPU会转到该指针表示的地址,并获取关联的数据。 如果数据不存在,那么如果幸运的话,程序将运行kaboom(在* nix上出现segfaults),如果不存在,则程序将执行奇怪的操作。 在这种情况下,main的userData被声明,因此数据实际上在那里。 但是,它尚未初始化,因此userData的内容可以是任何内容。 只要DoSomething不使用userData的内容,就可以了,因为它只是在操纵该地址。 但是,如果尝试取消对userData的引用,则CPU将进入内存并放入垃圾,这时程序可能会做各种奇怪的事情,因为userData内可能存在任何位模式,因此对userData任何计算都可能最终导致各种不同的结果。

C / C ++语言规范指出,使用未初始化的值会产生未定义的行为,这实际上是未定义的 ,这意味着编译器可以插入代码以擦除硬盘驱动器,或向Kernighan和Ritchie发送威胁性消息,或者在您使用时执行任何喜欢的操作未初始化的值。 但是,真正的编译器生成的代码仅给出垃圾位模式(通常是先前函数调用中剩下的堆栈数据)。 因此,尽管使用未初始化的值是错误的 ,但它不会杀死您。

所有关于未初始化值和错误指针的怪异都是C和C ++是不安全语言的最明显的方式之一。 埃里克利珀解释了另一种方式的C和C ++是不安全的位置

它是一个指针,并由以下行初始化:

esContext.userData = &userData;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM