簡體   English   中英

C中這個基於單一的索引技巧是否安全?

[英]Is this one-based indexing trick in C safe?

我看到有人這樣做的數組索引從1開始,而不是從C開始。

a = (int *) malloc(sizeof(int)*3) - 1

這有什么風險嗎?

理論風險:只有空指針和指向,對象或對象之后的指針才有效。 其他指針在使用時觸發未定義的行為(如果它們懸空)或通過指針算法創建它們。

實際風險:由隨機代碼審查員獲取。

有風險嗎? 當然。

malloc調用將從地址A開始為您保留一些空間,但隨后將a設置為A-4 由於A-4可能會存儲一些重要內容,如果您忘記了從1開始編制索引而無意中覆蓋a[0]處的值,則可能會遇到錯誤的時間。

但更重要的是,為什么呢? 這只會讓人們在閱讀你的代碼時感到困惑。

我會建議反對這種褻瀆;)

三件事:

首先 - 對我而言,指向不屬於您的程序的地址的指針是不好的做法。 一旦你忘記你創建了一個以1開頭的數組,你就可以在調試代碼時玩得開心(相信我,你會忘記)。

第二 - 所以你寫那樣的東西。 幾個月之后,其他人也開始對你的代碼做些什么,並沒有注意到你把它放在那里。 他將很樂意調試此代碼。 簡而言之,這違反了總合同。 每個人都期望數組或幾乎任何[]的東西從0開始並以“length - 1”結束。

第三 - 因為你違反了一般合同,你所做的數組將無法使用任何希望你的數組以0開頭的標准庫。每當你決定使用你的數組的任何庫時,你將不得不記住增加指針你將作為參數傳遞。

有了這個,您將不得不做很多記憶,思考和評論(對於使用您的代碼的任何人)。 思考和記憶應該留給創造力而不是鍋爐板代碼。

只有兩種情況,標准允許指針值指向除有效對象之外的其他內容:

  1. null指針值不指向任何內容。 可以復制空指針,並且可以使用==!=運算符進行比較。 在空指針上使用加法,減法或關系運算符; 使用解除引用操作符將產生未定義的行為,除非在某些情況下它既不請求實際的解引用操作符也不請求指針算法[例如,即使p為空, sizeof *p也是合法的]。

  2. 對於任何對象,可以有一個指向該對象的指針,或指向該對象的“一個過去”的指針; 向前者添加一個將產生后者,從后者中減去一個將產生前者。 在“一個過去”指針和指向不同對象的指針上使用==!=運算符有時可能會將它們報告為相等,即使在使用指向另一個對象的指針進行的訪問是合法的並且進行訪問的情況下也是如此使用“one-past”指針會觸發Undefined Behavior。

您的代碼嘗試生成一個指針,該指針不指向任何有效對象,並且不適合任何描述的行為類別。 注意,創建指向N個元素的“數組”的指針是有可能和合法的,這樣有效的下標范圍從KN到K-1,對於從0到N的任何K,包括N個對象的數組,它是可以生成指向任何N個對象的指針,或者指示“最后一個”的指針,總共N + 1個有效指針值)。 但是,在第一個對象之前的指針無效。

暫無
暫無

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

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