首页 > 解决方案 > sizeof() 运算符和指针声明中的问题

问题描述

这个问题是在我的 Sem-2 考试中提出的。问题要求我们提供所需的输出。

int main(void)
{
    int a[] = {10,20,30,40,50,60};

    int (*p1)[2]=a , (*p2)[3]= a;

    if(sizeof(p1)==sizeof(p2))
    printf("%d",*(*p1+2));

    if(sizeof(*p1)==sizeof(*p2))
    printf("%d",*(*(p2+1)));

    return(0);
}

编译器警告:

Warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
         initialization from incompatible pointer type [-Wincompatible-pointer-types]

我期望的输出:20

运行时得到的输出:30

使用:gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0

标签: cpointerssizeof

解决方案


让我们忽略未定义的行为以找出可能发生的情况。

p1并且p2都指向a[0](忽略不兼容的指针类型)。

p1并且p2都是指针。指向对象类型的指针通常大小相同(假设是这种情况),因此sizeof(p1)==sizeof(p2)也是如此。

p1是类型的int (*)[2],所以*p1也是类型的int[2]。在大多数表达式中,数组将衰减为指向其第一个元素的指针,因此在表达式*(*p1+2)中,*p1将衰减为 anint *并将指向a[0]。因此*p1+2将指向a[2]。因此*(*p1+2)将与 相同a[2],具有价值30。因此程序打印30

当数组是运算符的操作数时,数组不会衰减为指针sizeof*p1is of type int[2]and *p2is of type int[3],所以sizeof(*p1)==sizeof(*p2)等价于sizeof(int[2])==sizeof(int[3]),这是假的。因此,不会评估printf打印值的第二个调用。*(*p2+1)

(假设第二个printf被调用并被*(*p2+1)评估。*p2是类型int[3],在这个表达式中它衰减到int *指向a[0]。因此*p2+1指向a[1]。因此,*(*p2+1)将与a[1],具有值的相同20。)


推荐阅读