程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 請教關於總線錯誤(Bus error) 和 定位處理問題.

請教關於總線錯誤(Bus error) 和 定位處理問題.

編輯:關於C++

在編制一和運行一個程序的時候, 人們可能會遇到下面的信息:"Bus error(core dumped);. 當出現這種信息的時候,則表示在SPARC等RISC類型的CPU中發生了"違反定位訪問"的情況.例如,讀者可以閱讀下面的程序.

#include < string.h >
#include < stdio.h >
void main() {
    char buf[256];
    int * x;
    x = (int * ) & buf[1]; * x = 68000;
    printf("*x = %d\n", *x);
}

在這段程序中,能夠確保256byte的存儲器區域,其中能夠存儲68000的整數值.但是,這樣也會發

生前面所講的地址問題.在上述的情況下,數組buf的存儲區域從4的整數倍開始.在該數組的第二個

位置(即奇數地址單元)中賦予了數據類型為int的值.在RISC類型的CPU中,數據類型int值不能存儲

在4的整數倍地址中.因此,在將要對變量x賦值68000的時候,CPU不能夠繼續執行這個程序,則出現

Bus error這個信息,然後終止該程序的運行.

但是,在Pentinm(奔騰)系列的CPU中,則不會產生Bus error這個信息.這是因為采用了Pentinm

系列的80386的流程的RISC類型的CPU,提高了CPU的處理效率,或電路進行了簡單化處理,從8位開始

就使用了重視移植性的體系結構.

在上述中,我看得不是很明白.請高人詳細地解說一下.

其中最不能理解的是:

1. "數組buf的存儲區域從4的整數倍開始" 為什麼?

2. "在RISC類型的CPU中,數據類型int值不能存儲在4的整數倍地址中" 為什麼?

3. "x = (int *) & buf[1];" , 這條語句我知道是進行強制轉換,可是char類型的&buf[1]不是

只有8bit嗎?它怎麼可以轉換成具有32bit的x呢?

4. "x = (int *) & buf[1];" , 這條語句到底是怎麼實現的?或者說我該怎麼去理解它?

最佳答案

1 在SPARC等RISC類型的CPU中,int型數據在內存中4字對齊,char buf[256]s雖然是char型,但為256個(4的倍數),所以編譯器也使其4字對齊,及其內存開始地址必為4的整數倍,例如0x1000;

2。 該句表述錯誤,實際應為“在RISC類型的CPU中,數據類型int值只能存儲在4的整數倍地址中”

3 此處強制類型轉換的是指針而非char型變量,指針指向的內存只不過是一些數據,你可以認為這些數據是任意類型,char、int 、float、double甚至結構

4 假設buf的開始地址為0x1000,則這句將0x1001~0x1004的內容拷貝給x(x為int型),如前所述,int型數據地址必須為4的整數倍,此處0x1001不滿足該條件,故會引起CPU內部總線錯誤

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved