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

标签 c pointers casting

我试图分配 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;
    }
}

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

最佳答案

您不能从指针分配给数组。如果您将 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)

关于c - 从 'void*' 到 char(*) 的非法转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40683834/

相关文章:

c - xmlSecInit() 将断言失败打印到 stderr (g_xslt_default_security_prefs == NULL)

c - 保持数组不在 RAM 中

linux - 如何通过 mmap 映射内存指针进行写入以立即刷新?

c - C语言中从字符串中删除一个字符

pointers - 转到错误 : "embedded type cannot be a pointer to interface"

mysql - 在 MySQL 中将 int 转换为 varchar 数据类型

将 unsigned char * (uint8_t *) 转换为 const char *

c - Sprite 纹理中的透明度不起作用

java - 为什么你可以在不进行类型转换的情况下将 long 存储到 float 中

c - 为什么会出现这个段错误?