0

そのファイルのメモリマップがまだない場合は、ファイルをメモリマップする必要があります。私が提供したコードは機能していません。この関数を別のファイルから 2 回呼び出しており、そのたびに異なる mmapPtr を作成しています。

char *mmapPtr;

void MemoryMapFile()
{

    int fd;
    struct stat sbuf;
    if(mmapPtr==NULL) <--- why is this executed when I called MemoryMapFile() second time
    {
        // get file descriptor of file
        if ((fd = open("example.c", O_RDONLY)) == -1) 
        {
            perror("open");
            exit(1);
        }
        if (stat("example.c", &sbuf) == -1) 
        {
            perror("stat");
            exit(1);
    }
        if ((data = mmap((caddr_t)0, sbuf.st_size, PROT_READ, MAP_SHARED, fd, 0)) ==  (caddr_t)(-1)) 
        {
            perror("mmap");
            exit(1);
        }
        printf("mmap pointer %p \n",mmapPtr);
    }
4

2 に答える 2

3

char* mmapPtr がグローバルまたは静的ポインターでない場合、行

if(mmapPtr==NULL) 

初期化されていないポインターは NULL 値ではなくランダムな値を持つため、決して true を返しません。



宣言すれば

char *mmapPtr = NULL;

動作するはずです(他のエラーの可能性は無視してください)

于 2013-02-14T18:45:01.873 に答える
2

1) mmapPtr には、NULL などと比較できるように初期値が必要です。

char *mmapPtr = NULL;

2) これが機能し、if ブロックに入ると、mmapPtr に他の値を割り当てることはありません

mmapPtr = data; // I guess, as data is not defined in this snippet
于 2013-02-14T18:50:11.767 に答える