簡體   English   中英

添加偏移量時數組名的sizeof運算符

[英]sizeof operator on array name when offset is added

我對sizeof(arrayName + offset)感到好奇。 它給了我sizeof(pointer) 盡管數組名稱實際上是C語言中的常量指針,但是sizeof(arrayName)給出了數組字節的大小。 所以我猜編譯器即使將sizeof()視為(arrayName+offset)也是純指針,因此使用數組名稱時唯一的例外是sizeof(arrayName)

編譯器是否很好地定義了這種行為sizeof(arrayName + offset) 我正在使用MinGW 32位編譯器。 除了使用(sizeof(arrayName) - offset*sizeof(arrayName[0]))這樣的簡單數學運算之外,還有什么方法可以知道部分數組的大小?

在C / C ++中, sizeof(arrayName)不是不一致的語言構造嗎? 出於所有其他目的,將arrayName視為地址。 當我們將數組傳遞給函數時,此行為可能會導致錯誤,並且初學者始終對此有疑問。

除以下三種情況外,數組名稱都將轉換為指向其第一個元素的指針:

  • 地址運算符&的操作數
  • sizeof運算符的操作數。
  • _Alignof運算符的操作數。

C標准的 6.3.2.1部分對此進行了詳細說明:

3除非它是sizeof運算符, _Alignof運算符或一元&運算符的操作數,或者是用於初始化數組的字符串文字,否則其類型為“ array of type”的表達式將被轉換為類型為type的表達式指向數組對象初始元素的“類型指針”,不是左值。 如果數組對象具有寄存器存儲類,則該行為是不確定的。

在的情況下sizeof(arrayName + offset) ,的操作數sizeof是表達式arrayName + offset 該表達式的類型是指針類型,因為arrayName被轉換為指針,以便使用offset進行指針算術。 因此, sizeof表達式的計算結果為指針的大小。

在的情況下sizeof(arrayName) ,的操作數sizeof是一個數組,所以評價為在字節數組的大小。

這兩種行為都由C標准很好地定義。

暫無
暫無

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

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