2015-10-20 39 views
0

我試圖把一個整數值成一個字符數組,所以我可以有字節尋址存儲器。當我將要放置的整數和指向數組的字符指針傳入我的函數時,它們具有正確的值。賦值後,整數指針保持正確的值,但字符指針具有負值。這只是發生兩次十之和相同的兩個數字,每次.. 下面是函數數組c的值被否定有時

//Places an int into an array at memLocation 
void PutIntAt(int i, char *arr) 
{ 
    printf("value: %i at: %i\n", i, arr - &mainMemory[0]); 
    int *pos = (int*)arr; 
    *pos = i; 
    printf("*pos is: %x *arr is: %x\n", *pos, *arr); 
} 

輸出我從這個我得到的一個片段

value: 150 at: 28 
*pos is: 96 *arr is: ffffff96 
value: 50 at: 32 
*pos is: 32 *arr is: 32 
value: 20 at: 36 
*pos is: 14 *arr is: 14 
value: 10 at: 40 
*pos is: a *arr is: a 
value: 5 at: 44 
*pos is: 5 *arr is: 5 
value: 500 at: 48 
*pos is: 1f4 *arr is: fffffff4 
location 48 = -12 

我編譯使用gcc並使用-o選項和-std=gnu99選項。
mainMemory陣列是一個全局變量。不知道爲什麼會這樣。

+1

問題:不知道爲什麼會發生這種情況...... A:也許是因爲arr和mainMemory都可能被定義爲char,並且任何有符號字符算術結果> = 128都會導致負數? – paulsm4

+0

如果沒有看到其他代碼,很難看到問題出在哪裏。請發佈[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –

+0

@ameyCU 當我聲明主存儲器I與這條線做靜態: 炭mainMemory [MEM_SIZE]; 其中MEM_SIZE是5000 @ paulsm4 我最初的想法是相同的,但是300的值在150之前得到了正確的轉換。 – jgleesti

回答

2

您使用了錯誤的格式說明符printf。這會導致未定義的行爲。

您使用%x,這需要unsigned int,但提供*arr這是一個char。在你的系統char有一個範圍,包括負值。

要解決此問題,您可以使用%hhd%d說明符(後者由於默認參數提升而工作)。如果你想在char轉換爲無符號的,那麼你必須編寫代碼來進行轉換,如:

printf("%x\n", (unsigned char)*arr); 

注:printf的規格是不是寫得很清楚,但它通常解釋爲%u%x可能與任何較小的參數一起使用,該參數被提升爲一個非負整數。所以你可以在我的例子中使用%x而不是%hhx

+0

使用%hhd這兩個指針都會打印一個負值。我認爲這讓我朝着正確的方向前進。我猜他們打印負值,因爲整數佔用兩個字節的空間,我只打印一個字節? – jgleesti

+0

他們打印負值,因爲您傳遞了一個負值作爲參數。你的代碼基本上是'printf(「%d」,-2);'你問爲什麼它打印'-2'。考慮使用'unsigned char * arr'來代替。 –

+0

哦哇..這整個時間我認爲'%i'是無符號整數。我確信我正在傳遞一個積極的價值,事實證明它不是。謝謝@ M.M ..現在感覺有點羞怯 – jgleesti