c中的指针混乱。有人可以解释该代码的执行吗?

时间:2018-09-21 16:35:16

标签: c pointers

#include<stdio.h>
int main()
{
    struct node
    {
        int a, b, c;
    };

    struct node num = {3, 5, 6};
    struct node *ptr = & num;
    printf("%d\n", *((int*)ptr + 1 + (3-2)));
    return 0;
}

2 个答案:

答案 0 :(得分:0)

让我们简化

 printf("%d\n", *((int*)ptr + 1 + (3-2)));

 int *ip = (int*)ptr;
 int *ip2 = ip + 2;
 int v = *ip2;
 printf("%d\n", v);

即。

“将ptr作为指向整数列表的指针,显示第三个整数的值。”

第一步,将指向该结构的指针视为指向整数数组的指针,这是在利用(滥用吗?)以下事实(前3个字段几乎肯定会存储为3个连续整数)。这有点狡猾,我会毫不犹豫地做到这一点。我将其留给其他人以严格遵循标准的方式指出其是否正确。我对此表示怀疑,因为我们可能在某些平台上存在填充问题

答案 1 :(得分:0)

num是一种初始化为a=3b=5c=6的结构。 ptr是指向该结构的指针。一切正常,直到printf行为止。

构造

*((int*)ptr + 1 + (3-2)))

首先强制转换ptr,该指针指向指向int的指针:

(int*)ptr

指针指向成员a,并且定义明确。

现在将1添加到该指针:

(int*)ptr + 1

指针指向结构中成员a的正上方。除非对该指针取消引用,否则所有内容都定义良好。最后,3 - 2,即1再一次添加到结果指针。

(int*)ptr + 1

行为现在未定义。

(int*)ptr + 1 + (3 - 2)    

然后取消引用此无效指针,再次导致未定义的行为。

*((int*)ptr + 1 + (3 - 2))

打印出数字6且看起来像是该结构的第3个成员的原因只是a幸;)