c++ - 寻址函数时数组下标的无效类型

标签 c++ arrays memory-address

我的代码:

.h 文件:

extern const int* g_position;

inline DWORD pos_x(BYTE v) {
    if (1 <= v && v <= 3)
        return g_position[v][0];

    return 0;
}

inline DWORD pos_y(BYTE v) {
    if (1 <= v && v <= 3)
        return g_position[v][1];

    return 0;
}

.cpp 文件:

const int* g_position = (int*) 0x86b2fdc;

我想做的是处理基本上是二维数组的函数:

(DWORD (*)[4][2]) 0x86b2fdc<g_position>

由于某种原因,我在编译时遇到以下错误:

In function 'gev::DWORD pos_y(BYTE)':
error: invalid types 'const int[int]' for array subscript
    return g_position[v][0];

我的代码有什么问题?我将 g_position 声明为数组类型,因此它应该可以工作。

最佳答案

g_position 被声明为 int*,它只允许一个级别的取消引用,但您正在尝试执行两个取消引用。您需要将声明改为 int**:

extern const int** g_position;

const int** g_position = (int**) 0x86b2fdc;

更新:

int**int[][] 并不完全相同。但是,如果您考虑到 int[4][2]int[8] 具有相同的内存布局,那么您可以访问int[] 使用 int*,然后试试这个:

extern const int* g_position;

inline DWORD pos_x(BYTE v)
{
    if (1 <= v && v <= 3)
        return g_position[(v*4)+0];

    return 0;
}

inline DWORD pos_y(BYTE v)
{
    if (1 <= v && v <= 3)
        return g_position[(v*4)+1];

    return 0;
}

const int* g_position = (int*) 0x86b2fdc;

关于c++ - 寻址函数时数组下标的无效类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25151017/

相关文章:

arrays - C数组中的二进制数转十进制

c++ - std::thread 构造函数(变量数量)

c++ - 是否有适用于 Windows (Visual C) 的 unistd.h 的替代品?

c++ - 函数没有实现宏?

java - 通过 TCP 发送两种不同类型的数组

c - free() 如何影响堆上的内存地址?

c++ - 遍历字符串 vector ,从控制台获取输入,给出段错误

Java - NullPointerException,更改数组值

c - 如何使用C打印UNIX应用程序内存的内存地址?

C语言: How exactly is the size of an array calculated in C