【发布时间】:2021-10-15 17:43:49
【问题描述】:
如您所见,我使用 printf 函数使用指针打印二维数组,但我收到无效类型参数的错误。为了检查,我尝试打印下面的代码,我用k 和指针c 打印k 的值。我没有错误
int main ()
{
int a[3][2]={2,5,9,11,23,46};
int *p;
p=&a[0][0];
for(int i=0;i<=2;i++)
{
for(int j=0;j<=1;j++)
{
printf("\n value of the 2 d array: %d",*(*(p+i)+j));
}
}
int k=6;
int *c;
c=&k;
printf("%d",*c);
}
【问题讨论】:
-
*(p+i*2+j)? (我不确定这是否会引发未定义的行为) -
@Subhendu Nayak 错误信息有什么不清楚的地方?
-
*(p+i)是一个整数,*(p+i) +j是一个整数,并且没有定义*(integer)。正如 MikeCAT 所说,使用*(p + 2*i + j)。 -
@MikeCAT:给定
p = &a[0][0];,p指向int [2]中的一个元素,并且p+i*2+j仅定义为 0 ≤i*2+j≤ 2,根据 C 2018 6.5。 6.尽管在a[0][1]之后内存中还有更多int对象,但指针算法并未在a[0]及其名义端点&a[0][2]中的元素之外定义。此外,由于首先执行+i*2,因此仅在满足 0 ≤i*2≤ 2 和 0 ≤i*2+j≤ 2 时才定义p+i*2+j。 -
@susanth29:因为行为不是由 C 标准定义的,所以我们无法知道代码是否可以工作(除非编译器指定它将作为语言的扩展工作)。在某些情况下,编译器优化可能会破坏尝试越界访问子数组的代码。
标签: c pointers multidimensional-array implicit-conversion dereference