我有这样的代码:
char* talk[516] = {(char*)1};
#define testValue (*(int*)talk[0])
当调用以下代码行时,我收到一个空指针异常。
testValue = 0;
这是为什么呢? talk[]
的值不是都初始化了吗?
编辑
我想要做的是,有 516 个数字值(float
和 int
)存储在 char*
数组中. testValue
应指向存储在数组第一个元素中的 int
值。下一个值可能是 #define testValue2(*(float*)talk[1])
。
最佳答案
对于 char* talk[516] = {0};
,talk
的所有元素(即 char*
)都被初始化为值 0
(即空指针)。
对于 char* talk[516] = {(char*)1};
,talk
的第一个元素初始化为值 1
,这不是指针的有效值。 (并且其他元素仍被初始化为空指针。)*(int*)talk[0]
失败,因为您正在尝试将 char*
转换为 int*
,指向内存地址1
,然后对其进行解引用。
您应该使用有效值初始化元素,例如:
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. 注意如果使用new
初始化talk
元素,最后需要delete
2. 你也可以使用循环来初始化talk
。
3. 使用 char*
而不是 void*
令人困惑,IMO。
4. 考虑使用 std::map
而不是宏魔法。
关于c++ - 散列定义到导致空点异常的数组的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39609168/