C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用mmap()而不是malloc()大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试完成一个使用系统调用完成的练习,并且需要为struct *分配内存.我的代码是: @H_552_2@myStruct * entry = (myStruct *)mmap(0,SIZEOF(myStruct),PROT_READ|PROT_WRITE,MAP_ANONymOUS,-1,0);

为了澄清,我不能使用malloc()但可以使用mmap().我在Netbeans上的Windows上没有遇到任何问题,但是现在我正在编译并在Ubuntu上从命令行运行我每次尝试访问它时都会收到“Segmentation Fault”.

有没有理由说它可以在一个而不是另一个上工作,并且mmap()是以这种方式分配内存的有效方法吗?我担心的是我最初会为每个mmap()调用分配大块内存,现在我无法让它运行.

另外,我的mmap返回的错误是22 – 无效参数(我在编写问题时做了一些故障排除,因此错误检查不在上面的代码中).地址为0,自定义SIZEOF()函数在其他mmap参数中有效,我使用MAP_ANONymOUS,因此fd和offset参数必须分别为-1和0.

PROT_READ | PROT_WRITE部分有问题吗?

解决方法

您需要在标志中指定MAP_PRIVATE. @H_552_2@myStruct * entry = (myStruct *)mmap(0,MAP_PRIVATE|MAP_ANONymOUS,0);

manual page

您只需要其中一个标志MAP_PRIVATE或MAP_SHARED – 但您没有给出其中任何一个.

一个完整的例子:

#include <sys/mman.h>
#include <stdio.h>

typedef struct
{
    int a;
    int b;
} myStruct;

int main()
{
    myStruct * entry = (myStruct *)mmap(0,sizeof(myStruct),MAP_PRIVATE | MAP_ANONymOUS,0);

    if (entry == MAP_@L_197_18@) {
        printf("Map @L_197_18@.\n");
    }
    else {
        entry->a = 4;
        printf("success: entry=%p,entry->a = %d\n",entry,entry->a);
    }
    return 0;
}

(上面没有MAP_PRIVATE当然是你作为MCVE提供的一个很好的例子.这使得其他人更容易帮助你,因为他们可以准确地看到你做了什么,并测试他们的建议解决方案.你应该总是提供MCVE).

大佬总结

以上是大佬教程为你收集整理的使用mmap()而不是malloc()全部内容,希望文章能够帮你解决使用mmap()而不是malloc()所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。