首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么让这个程序代码打印4

是什么让这个程序代码打印4
EN

Stack Overflow用户
提问于 2012-11-21 22:01:51
回答 3查看 151关注 0票数 1
代码语言:javascript
复制
int main(){
  int *p=0;
  printf("%d",++p);
}

在我的机器中,我得到的输出是4;我最初认为*p指向地址0,它的增量从0指向地址4。

后来我声明了*p = -1;我认为它应该抛出错误,因为-1不能是一个地址,但它输出"3“:(

请让我知道这里发生了什么。提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-21 22:05:28

int *p=0在地址0处声明了一个指针。

++p将该指针递增特定于主机的sizeof int。这在您的系统中是4个字节。

int *p=-1提供了一个地址为0xffffffff的指针(假设是32位指针)

++p等同于0xffffffff + 4,即0x100000003。这会溢出一个32位的int,只剩下0x00000003

票数 11
EN

Stack Overflow用户

发布于 2012-11-21 22:04:13

未定义的行为。

当你说:

代码语言:javascript
复制
int* p = 0;

您声明了一个指向null (或C++11中的nullptr )的指针。然后,当你这样做的时候:

代码语言:javascript
复制
printf("%d", ++p);
票数 4
EN

Stack Overflow用户

发布于 2012-11-21 22:08:30

我们可以检查C标准来决定C实现是否应该允许负指针。然而,-1可能是有效的地址值(32位的0xffffffff ),递增它会导致0xffffffff+4= 0x03。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13494950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档