首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C程序的程序输出

C程序的程序输出
EN

Stack Overflow用户
提问于 2015-04-16 03:27:55
回答 2查看 59关注 0票数 1

请解释一下下面提到的程序的输出。我认为输出应该是1,但它不是1

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int  a[] = {1, 2, 3, 4, 5, 6};
    int *ptr = (int*)(&a+1);

    printf("%d ", *(ptr-1));
    getchar(); 

    return 0;
} 
EN

回答 2

Stack Overflow用户

发布于 2015-04-16 03:32:08

这是因为&a的类型是int(*)[6],因此&a + 1 != &a[0] + 1就是您想要的,给定您的预期输出。

如果打印地址&a&a[0],它们将是相同的,但是递增&a与递增&a[0]不同,因为sizeof(int) != sizeof(int *),虽然不总是正确的,但您的代码不应该假设它是正确的,或者依赖于它。

此外,您使用强制转换似乎是因为编译器抱怨&a是不兼容的指针类型,如果指针是兼容类型,则不需要强制转换,因此

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int  a[] = {1, 2, 3, 4, 5, 6};
    int *ptr = &a[0] + 1;

    printf("%d\n", *(ptr-1));

    return 0;
}

编译只需查找,输出将如您所预期的那样为1

票数 3
EN

Stack Overflow用户

发布于 2015-04-16 04:35:51

a&a是相同的值,

a的类型为int [6]

&a的类型为int (*)[6]

这意味着

代码语言:javascript
复制
    ptr
 == (int *)(          &a + 1                )
 == (int *)( (char *) &a + 1*sizeof(*&a)    )
 == (int *)( (char *) &a + 1*sizeof(a)      )
 == (int *)( (char *) &a + 1*6*sizeof(int)  )
 == (int *)( (char *) a  + 1*6*sizeof(int)  )
 == (int *)( (char *) a  + 1*6*sizeof(*a)   )
 == (int *)(          a  + 6                )
 == &a[6]

因此

代码语言:javascript
复制
*(ptr-1) == *(a+5) == a[5] == 6

打印"6“的原因。

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

https://stackoverflow.com/questions/29659099

复制
相关文章

相似问题

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