[英]Casting uint16_t to unsigned int
我們已經投射了二維數組:
struct pixel(*image_data)[width] = (struct pixel(*)[width])img->px;
其中寬度:
unsigned width = img->size_x;
和結構圖像:
struct image {
uint16_t size_x;
uint16_t size_y;
struct pixel *px;
};
第二個問題:
寬度可以容納的最大值是多少?
第三:
如果我們在 x 和 y 很長的地方迭代 image_data[x][y],那么是否存在緩沖區溢出?
演員表沒有分配 memory。 image_data
變量的類型是“指向struct pixel
長度width
數組的指針”(使用image_data
聲明時的width
值),所以image_data + i
是指向第i
行的指針(從 0 開始計數) struct pixel
。
理論上, width
可以是最大為SIZE_MAX / sizeof (struct pixel)
的任何值,但可能會受到其他約束的限制。 struct image
中的size_x
和size_y
也受其類型uint16_t
的限制,最大值為 65535。
如果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_t
, uint16_t
的最大值正好是 65535。width 的類型為unsigned int
, unsigned int
int 的最大值至少為width
width
被初始化為img->size_x
的值而不會被截斷。
在對該問題的評論中,Lundin 提到struct Pixel *
與struct pixel(*)[width]
不兼容。 確實如此,但 C 允許從一種指針類型轉換為另一種指針類型。 如果結果指針未正確對齊引用類型(此處引用類型為struct pixel [width]
),則行為未定義。 數組類型比相應的元素類型具有更嚴格的 alignment 要求是非常不尋常的,所以這可能是可以的。 即使數組類型比元素類型有更嚴格的 alignment 要求,只要指針實際上正確對齊就可以了。 如果img->px
指向由malloc
, calloc
或類似分配的塊,則對於具有“基本” alignment 的任何 object 類型,它都正確對齊。 主要問題是,如果通過img->px
和image_data
訪問像素數據,那么這將違反嚴格的別名規則,因為指針具有不兼容的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.