这个小问题是在今天学习Linux系统编程的时候出现的。
在Vim下写mmap()函数的时候,mmap()是返回的是void*类型,在创建映射区成功的时候会返回映射区首地址,要往映射区进行字符串的读写操作,因此我们尝试使用char*类型的指针p去指向mmap(),这里出现了第一个问题:

mmap.cc:14:13: error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]
     p = mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd ,0);

原来g++下不支持void*隐式转换成char*,需要进行强制转换:

char *p = NULL;
p = static_cast<char*>(mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd ,0));

如此一来,编译就成功了!
再进行映射区的读写操作时,发现使用cout p便可以进行读操作:

cout<< p <<endl;

和以前遇到的情况不太一样,因此查了一下,发现:
按照以往给cout一个指针,它输出的是指针所指向的地址,但是如果指针是char *类型的,cout会直接输出char *指针所指向的字符串。
因此,如果要显示char *指针所指向的地址,把char *类型的指针强制转化为int *类型的指针即可解决:

cout<< (int *)p <<endl;

sebastian_fcs
1 声望0 粉丝