簡體   English   中英

可以通過這種方式實現“struct hack”嗎?

[英]Can “struct hack” be implemented this way?

Struck hack用於分配比結構本身初始需要更多的內存,以便您可以引用數組的越界部分,以便保留在實際分配的內存中。

這是它的工作原理。

struct Foo
{
  // ..
  size_t size;
  int data[1];
};

const size_t SIZE = 100;
Foo *p = (Foo*) malloc(sizeof(Foo) + sizeof(int) * (SIZE - 1));
p->size = SIZE;
for (int i = 0; i < p->size; ++i) (p->data)[i] = i;

題:

我們可以只使用一個整數而不是一個大小為1的數組嗎? 如果這是可行的,那么為什么數組大小版本變得更受歡迎呢?

struct Foo
{
  // ..
  size_t size;
  int data;
};

// ..
for (int i = 0; i < p->size; ++i) (&p->data)[i] = i;

訪問其邊界之外的數組是未定義的行為。 例如,您的調試器可能決定在數組的每一側插入金絲雀陣列。

聰明的做法是使用std::vector ,這就是它的用途。 struct hack是一個舊的C-ism,在C ++中是多余的。

對於第二個版本,您無法使用漂亮的直接陣列synatx。 你做不到

p->data[i]

不再需要做了

(&p->data)[i]

什么看起來更難看。

因為寫p->data[i](&p->data)[i]更方便。

因為p->data[i](&p->data)[i]更短且更易讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM