我正在尝试分配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);
不确定如何解决这个问题。请帮忙。
答案 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(...));