处理指向数组的指针时发现意外行为

时间:2018-05-22 08:56:49

标签: c arrays pointers

查看下面给出的代码:

#include<stdio.h>
int main()
{
     int (*p)[3];
     int a[3]={10,11,12};
     p=&a;
     printf("%d\n", *p[0]);
     printf("%d\n", *p[1]);
     printf("%d\n", *p[2]);
     return 0;
}

printf(&#34;%d \ n&#34;,* p [0]);打印10是预期的。

但是printf(&#34;%d \ n&#34;,* p [1]);不打印11。

和 printf(&#34;%d \ n&#34;,* p [2]);不打印12.

为什么呢?这背后的原因是什么?

3 个答案:

答案 0 :(得分:4)

运营商优先权。 []的优先级高于*,因此当您编写*p[0]时,它与(*(*(p + 0)))相同 - 您对数组指针执行指针运算。

这意味着,例如p[1]为您提供了p + 3*sizeof(int)个字节的地址,这些字节正在越过边界访问数组。

正确的代码应该是:

 printf("%d\n", (*p)[0]);
 printf("%d\n", (*p)[1]);
 printf("%d\n", (*p)[2]);

答案 1 :(得分:2)

var textFileAsBlob = new Blob([data], {type: type}); //type is correct type (image/png, text/csv ...) var fileNameToSaveAs = name + '.' + extension; //Name of a file and correct extension var downloadLink = document.createElement("a"); *p[k],而不是*(p[k])

您获得(*p)[k]的预期结果可以通过它与*p[0]相同来解释,并且将零置于哪个顺序并不重要。

p[0][0]p[1][0])与*p[1]p[0][1])不同。
(它甚至未定义,因为(*p)[1]不存在。)

答案 2 :(得分:0)

int (*p)[3];是指向int的指针数组。

int a[3]={10,11,12};int的数组。数组和指针共享很多属性。例如,您可以使用数组表示法作为指针。

让我们采用与int *p = a相同的普通指针int *p = &a[0]。现在指针指向数组的第一个元素。你可以像使用数组一样使用它。

 printf("%d\n", p[0]); //10
 printf("%d\n", p[1]); //11
 printf("%d\n", p[2]); //12

你所做的是获取数组的地址 - &#34;指针&#34;这会产生数组第一个元素的地址。因为&a == a

这会写入指针数组的第一个元素,而不是

p[0] == a
p[1] == unknown
p[2] == unknown

通过执行*p[0],您获得了p(p[0])的第一个元素,并取消引用它*。 这与*aa[0]相同。

但是,通过执行*p[1],您将进入未知内存位置(p[1])并对其进行解除*。这是未定义的行为。