#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <errno.h>
int main(int argc, char *argv[])
{
int fd, offset;
char *data;
struct stat sbuf;
int counter;
if (argc != 2)
{
fprintf(stderr, "usage: mmapdemo offset\n");
exit(1);
}
if ((fd = open("mmapdemo.c", O_RDONLY)) == -1)
{
perror("open");
exit(1);
}
offset = atoi(argv[1]);
if (offset < 0 || offset > sbuf.st_size-1)
{
fprintf(stderr, "mmapdemo: offset must be in the range 0 - %d \n",
sbuf.st_size-1);
exit(1);
}
data = mmap((caddr_t)0, sbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (data == (caddr_t)(-1))
{
perror("mmap");
exit(1);
}
// print the while file byte by byte
while(counter++<=sbuf.st_size)
printf("%c", *data++);
return 0;
}
当我运行此代码时,它会给出错误
gcc mmap.c -o mmap mmap.c:在函数'main'中: mmap.c:38:警告:格式'%d'需要类型'int',但参数3的类型为'long int'
请告诉我,为什么会这样?
答案 0 :(得分:3)
我相信你错过了代码。
但是,在你的一个printf语句中,你使用的是%d标志,但是仍然需要使用%ld。
编辑:
继承人的错误:
fprintf(stderr, "mmapdemo: offset must be in the range 0 - %d \n",
sbuf.st_size-1);
应该是:
fprintf(stderr, "mmapdemo: offset must be in the range 0 - %ld \n",
sbuf.st_size-1);
答案 1 :(得分:1)
您的代码未正确显示。你得到的错误只是一个警告。这意味着您使用了错误的格式字符串。对于long int,您可能应该使用%ld。
答案 2 :(得分:1)
嗯,您发布的代码段看起来并不像它有38行,但您引用的错误来自使用格式%d
而不是%ld
或其中一个相关的C99符号格式。
好的,现在发布了更多代码。虽然st_size
在技术上是off_t
,而且off_t没有C99格式说明符,但%zd
会打印size_t
并符合C99。这可能是你最好的。
然而,实际上,%ld
也会起作用,是可以接受的选择。
更新:好的,我正在为您提供有关编译程序的建议,但 R 指出便携式程序至少应该运行ILP32,LP64和LLP64,因此在这种情况下必须转换为格式中的任何类型,如果您希望所有64位实际打印在所有这些系统上,那么唯一的选择是{{ 1}}和强制转换为%lld
。
答案 3 :(得分:0)
此:
fprintf(stderr, "mmapdemo: offset must be in the range 0 - %d \n",sbuf.st_size-1);
应该是:
fprintf(stderr, "mmapdemo: offset must be in the range 0 - %ld \n",sbuf.st_size-1);