c++ - 散列定义到导致空点异常的数组的第一个元素

标签 c++ arrays pointers

我有这样的代码:

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

当调用以下代码行时,我收到一个空指针异常。

testValue = 0; 

这是为什么呢? talk[] 的值不是都初始化了吗?

编辑

我想要做的是,有 516 个数字值(floatint)存储在 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/

相关文章:

c++ - 如何找到导致 "malloc(): memory corruption: 0x00"的行

正确的二维数组内存分配/解除分配?

ios - 无法在 SWIFT 中的方法之外保留数组数据

c - 如何声明和初始化指向char指针数组的指针数组?

在 C 中复制无符号字符

c++ 如何正确地将 .cpp 拆分为 .cpp 和 .h

javascript - 是否可以从不同的线程调用 JS 函数?

c++ - 我在显示链接列表时遇到问题

溢出时的 C++ 数组绑定(bind)异常 - "cout"并且没有 "cout"

c++ - 在分配之前传递分配的指针