C語言中的邊界計算與不對稱邊界(一)

2021-06-22 13:28:31 字數 737 閱讀 3454

1、如果乙個陣列有10個元素,那麼這個陣列下標的允許取值範圍是什麼呢?

這個問題對於不同的程式語言有著不同的答案。例如,對於fortran,pl/i以及snobol4等程式語言,這個陣列的下標取值預設從1開始,而且這些語言也允許程式設計者另外指定陣列下標的起始值。而對於algol和pascal語言,陣列下標沒有預設的起始值,程式設計者必須顯式的指定每個陣列的下界與上界。在標準的basic語言中,宣告乙個擁有10個元素的陣列,實際上編譯器分配了11個元素的空間,下標範圍從0到10。

在c語言中,這個陣列的下標範圍是從0到9。乙個擁有10個元素的陣列中,存在下標為0的元素,卻不存在下標為10的元素。c語言中的乙個擁有n個元素的陣列,卻不存在下標為n的元素,它的元素的下標範圍是從0到n-1為此,由其他程式語言轉而使用c語言的程式設計師在使用陣列時特別要注意。

例如:

int i, a[10];

for(i=1; i<=10; i++)

a[i] = 0;

這段**本意是要設定陣列a中所有元素為0,卻產生了乙個出人意料的「負效果」。在for語句的比較部分本來是i<10,卻寫成了i<=10,因此實際上並存在a[10]被設定為0,也就是記憶體中在陣列a之後的乙個字的記憶體被設定為0。如果用來編譯這段程式的編譯器按照記憶體位址遞減的方式來給變數分配記憶體,那麼記憶體中陣列a之後的乙個字實際上是分配給了整型變數i。此時,

本來迴圈計數器i的值為10,迴圈體內將並不存在的a[10]設定為0,實際上卻是將計數器i的值設定為0,這就陷入了乙個死迴圈。

C語言中的邊界計算與不對稱邊界(二)

儘管c語言的陣列會讓新手感到麻煩,然而c語言中陣列的這種特別的設計正是其最大優勢所在。要理解這一點,以下是一些簡單解釋。在所有常見的程式設計錯誤中,最難於察覺的一類是 欄杆錯誤 也常被稱為 差一錯誤 off by one error 例如這個問題 100英呎長的圍欄每隔10英呎需要一根支撐用的欄杆,...

C語言中sizeof用法中關於邊界對齊的問題

本文主要包括二個部分,第一部分重點介紹在vc中,怎麼樣採用sizeof來求結構的大小,以及容易出現的問題,並給出解決問題的方法,第二部分總結出vc中sizeof的主要用法。1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現...

簡單說一下C語言資料型別取值範圍不對稱的原因

首先是,數字在機器中是以補碼形式進行儲存的。了解過原碼 補碼 反碼的應該知道,在正數範圍內,它們三個是一樣的。因此我們討論有符號數的補碼表示。舉例char型別,該型別的取值範圍是 128,127 為什麼tmax比tmin的絕對值小1呢?本來char有8個bits,作為有符號型別,除去最高位,還剩7b...