2016-09-21 30 views
1

我有代碼看起來像這樣:哈希限定到數組的第一元素引起的空點例外

char* talk[516] = {(char*)1}; 
#define testValue (*(int*)talk[0]) 

我收到一個空指針異常時下面的代碼行,然後調用。

testValue = 0; 

這是爲什麼? talk[]的全部值是否已初始化?

EDIT

我想要做的是,存在存儲在char*陣列516倍的值(float S和int S)。 testValue應該指向存儲在數組的第一個元素中的int值。下一個值可能是#define testValue2(*(float*)talk[1])

+0

因爲'talk'的所有元素(即char *')都是用值'0'(即空指針)初始化的。 – songyuanyao

+0

如果我將該值設爲1,則得到相同的錯誤。 –

+0

我更新了問題以更好地反映此問題。 –

回答

2

對於char* talk[516] = {0};,使用值0(即空指針)初始化talk的所有元素(即char*)。

對於char* talk[516] = {(char*)1};talk的第一個元素使用值1進行初始化,該值不是指針的有效值。 (其他元素仍然初始化爲空指針。)*(int*)talk[0]失敗,因爲您嘗試將char*轉換爲int*,它指向內存地址1,然後對其進行解除引用。如果使用new初始化的talk元素,你需要在最後delete他們

int i; 
float f; 
void* talk[516] = {&i, &f, /*...*/}; 

#define testValue (*(int*)talk[0]) 
#define testValue2 (*(float*)talk[1]) 

testValue = 1; 
testValue2 = 1.5; 

1.注:

你應該初始化有效值元素,如。
2.您也可以使用循環來初始化talk
3.使用char*而不是void*令人困惑,IMO。
4.考慮使用std::map而不是宏魔法。

+0

有趣 - 但我試圖訪問數組的第一個元素。 –

0
char* talk[516] = {0}; 

這意味着陣列談話的元素都是NULL指針。所以當你試圖尊重它時,你會得到這個例外。

0

參見下面的取代序列

testValue = 0; 
# 
(*(int*)talk[0]) = 0; 
# 
char* c = talk[0]; // == 1 
(*(int*)c) = 0; 
# 
char* c = talk[0]; 
int* i = (int*)c; // == ? (*) 
(*i) = 0; 

* Alignment issues on pointer casting

鑄造未定義的行爲一char*int*結果,因爲int*具有比char*嚴格對齊要求。

相關問題