从' void *'非法转换到char(*)?

时间:2016-11-18 18:30:47

标签: c pointers casting

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

var user = UserManager.FindById(User.Identity.GetUserId());

我的代码如下。

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);

不确定如何解决这个问题。请帮忙。

2 个答案:

答案 0 :(得分:1)

您无法从指针分配数组。如果你使my_pointer成为一个简单的指针,那么这个赋值就可以了,但是你将失去在你发布的代码中进行双重索引的能力。相反,你需要提出一个索引方案,允许你使用1D阵列。您的代码将如下所示:

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)

答案 1 :(得分:0)

您应该使用强制类型,因为您实际上使用的是C ++语言。

在C中,这段代码可行:

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

此处my_memory是指向char s数组的指针。 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(...));