簡體   English   中英

將 uint16_t 轉換為 unsigned int

[英]Casting uint16_t to unsigned int

我們已經投射了二維數組:

struct pixel(*image_data)[width] = (struct pixel(*)[width])img->px;
  1. 我不明白它是如何轉換和分配 memory 的?

其中寬度:

  unsigned width = img->size_x;

和結構圖像:

struct image {
   uint16_t size_x;
   uint16_t size_y;
   struct pixel *px;
};

第二個問題:

寬度可以容納的最大值是多少?

第三:

如果我們在 x 和 y 很長的地方迭代 image_data[x][y],那么是否存在緩沖區溢出?

  1. 演員表沒有分配 memory。 image_data變量的類型是“指向struct pixel長度width數組的指針”(使用image_data聲明時的width值),所以image_data + i是指向第i行的指針(從 0 開始計數) struct pixel

  2. 理論上, width可以是最大為SIZE_MAX / sizeof (struct pixel)的任何值,但可能會受到其他約束的限制。 struct image中的size_xsize_y也受其類型uint16_t的限制,最大值為 65535。

  3. 如果x >= 0並且y >= 0並且y < width (其中width仍然具有值sizeof (*image_data) / sizeof ((*image_data)[0]) )並且img->px指向的緩沖區位於最小sizeof (struct pixel) * (x + 1) * width字節長(並為struct pixel正確對齊),則不會有緩沖區溢出。

關於width變量的定義:

unsigned width = img->size_x;

img->size_x的類型為uint16_tuint16_t的最大值正好是 65535。width 的類型為unsigned intunsigned int int 的最大值至少為width width被初始化為img->size_x的值而不會被截斷。

在對該問題的評論中,Lundin 提到struct Pixel *struct pixel(*)[width]不兼容。 確實如此,但 C 允許從一種指針類型轉換為另一種指針類型。 如果結果指針未正確對齊引用類型(此處引用類型為struct pixel [width] ),則行為未定義。 數組類型比相應的元素類型具有更嚴格的 alignment 要求是非常不尋常的,所以這可能是可以的。 即使數組類型比元素類型有更嚴格的 alignment 要求,只要指針實際上正確對齊就可以了。 如果img->px指向由malloccalloc或類似分配的塊,則對於具有“基本” alignment 的任何 object 類型,它都正確對齊。 主要問題是,如果通過img->pximage_data訪問像素數據,那么這將違反嚴格的別名規則,因為指針具有不兼容的類型。

暫無
暫無

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

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