簡體   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