cdsfiui 发表于 2016-09-21 16:40

指针的减法有编译错误,提示转型是非法的。

我想计算一下一个程序的bss段和堆的底部之间的距离,看看sbrk最多能把数据段扩大多少。代码如下:

$ cat 1.cpp
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
int empty;//bss
int main()
{
char*p=(char*)malloc(0);
printf("%d\n",(int)p-(int)&empty);
return 0;
}

编译:

$ g++ 1.cpp
1.cpp: In function ‘int main()’:
1.cpp:8:22: error: cast from ‘char*’ to ‘int’ loses precision [-fpermissive]
   printf("%d\n",(int)p-(int)&empty);
                      ^
1.cpp:8:30: error: cast from ‘int*’ to ‘int’ loses precision [-fpermissive]
   printf("%d\n",(int)p-(int)&empty);
                              ^

为什么不能强转指针类型到int,我的程序应该如何修改才能达到预期?
谢谢。

windoze 发表于 2016-09-21 16:54

所以你要用intptr_t,或者用long。

cdsfiui 发表于 2016-09-21 17:02

windoze 发表于 2016-09-21 16:54
所以你要用intptr_t,或者用long。

为什么long可以, 而int就不行?

MMMIX 发表于 2016-09-21 21:06

回复 3# cdsfiui

你都不看错误信息么?

hellioncu 发表于 2016-09-21 21:13

转换成 char *再减就行

windoze 发表于 2016-09-21 22:01

回复 3# cdsfiui

你要是能找台奔腾CPU的电脑int就可以。
页: [1]
查看完整版本: 指针的减法有编译错误,提示转型是非法的。