【问题标题】:Illegal conversion from 'void*' to char(*)?从 'void*' 到 char(*) 的非法转换?
【发布时间】:2017-04-02 16:52:41
【问题描述】:

我正在尝试分配 10000 个页表但无法编译。我收到以下错误。

error: invalid conversion from 'void*' to 'char (*)[(<anonymous> + 1)]' [-fpermissive]
     char (*my_memory)[sysconf(_SC_PAGESIZE)] = mmap(NULL,PAGE_SIZE * (100000 + OVERSIZE),PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0);

我的代码如下。

int main(int argc, char **argv) {
    unsigned long physical_addr;
    uint8_t *buf;
    unsigned long virtual_addr;
    char (*my_memory)[sysconf(_SC_PAGESIZE)] = mmap(NULL,PAGE_SIZE * (100000 + OVERSIZE),PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0);
    int i;
    for (i = 0; i * sizeof(*my_memory) < 10000; i++) {
        my_memory[i][0] = 1;
    }
}

不知道如何解决这个问题。请帮忙。

【问题讨论】:

标签: c pointers casting


【解决方案1】:

您不能从指针分配给数组。如果您将my_pointer 设为裸指针,则此分配将起作用,但您将失去在发布的代码中执行双索引的能力;相反,您需要提出一个索引方案,允许您使用一维数组。您的代码将如下所示:

int main(int argc, char **argv) {
    unsigned long physical_addr;
    uint8_t *buf;
    unsigned long virtual_addr;
    char *my_memory = mmap(NULL,PAGE_SIZE * (100000 + OVERSIZE),PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0);
    int i;
    for (i = 0; i < 10000; i++) {
        my_memory[PAGE_SIZE * i] = 1;
    }
}

(请注意,我在某种程度上推断最后一个循环的目的;我的解释是您希望它将每个“页面”的第一个字节设置为 1)

【讨论】:

  • @Kninnug 已经纠正了我,它不是一个数组,而是一个指向数组的指针..
  • OP 显然想要双索引。用单一的计算索引代替它是可行的,但我认为你可以做得更好。
  • 感谢您的回复。我实际上是在寻找使用双索引的解决方案。
  • @AshwinGopalakrishnan 您可能想回答人们在问题下方的 cmets 中向您提出的一些问题。如果您想获得比这个更好的解决方案,您应该回答这些问题。
【解决方案2】:

您应该使用转换为正确的类型,因为您实际上使用的是 C++ 语言。

在 C 中,这段代码可以工作:

char (*my_memory)[sysconf(_SC_PAGESIZE)] = mmap(...);

这里的my_memory 是一个指向chars 数组的指针。 C 具有从 void* 到任何指针的内置转换,因此代码在 C 中是合法的,并且可以执行您想要的操作。

如果你想让它在 C++ 中工作,你应该添加一个演员表。

my_memory 的类型是char (*)[sysconf(_SC_PAGESIZE)]。所以铸件看起来像这样:

char (*my_memory)[sysconf(_SC_PAGESIZE)] = static_cast<char (*)[sysconf(_SC_PAGESIZE)]>(mmap(...));

或者,用一种不那么冗长的方式:

auto my_memory = static_cast<char (*)[sysconf(_SC_PAGESIZE)]>(mmap(...));

或者,如果您想让代码尽可能短(可读性较差):

auto my_memory = (char (*)[sysconf(_SC_PAGESIZE)])mmap(...);

有些人更喜欢使用typedef 来处理复杂类型,例如指向数组的指针。如果你想走这条路,语法如下:

using my_array_ptr_type = char (*)[sysconf(_SC_PAGESIZE)];
auto my_memory = static_cast<my_array_ptr_type>(mmap(...));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2018-06-13
    • 2014-06-09
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多