【发布时间】:2020-08-31 13:21:48
【问题描述】:
#include<stdio.h>
int main()
{
int a[2] = {1, 2};
void *ptr = &a;
ptr = ptr + sizeof(int);
printf("%d", *(int *)ptr);
return 0;
}
对于这段代码,我得到 2 作为输出 但我刚刚读到 a=&a[0] ,即数组的名称 = 数组的基地址 那么为什么如果我写了 void *ptr=&a 它会给出正确的输出,实际上是把 ptr=&&a[0] 这是未定义的行为吗
ps:我是初学者,第一次发问题请详细解释一下
编辑:如果我们使用 int *ptr ,即整数指针,为什么它不起作用
【问题讨论】:
-
a表示&a[0]仅在a不起作用的地方。否则a仅表示a。在这种情况下,a仅表示a。 -
ptr = ptr + sizeof(int);引发编译错误。对 void 指针执行算术是不合规的。 (只有 GNU 扩展才允许。)然后一旦执行(如果您的编译器允许。),使用该指针将调用未定义的行为。 -
除非您使用提供扩展的编译器,否则您发布的代码将永远不允许您构建,因此无法运行。您使用的是什么编译器(和编译器版本)?发布的代码是否完全是您正在运行的代码?
-
是的,它与我在 gcc (tdm-1) 5.1.0 中使用的代码完全相同,我不太了解它
标签: c