问题描述
int func(int a[]);
int main()
{
int c = 21;
int *b;
b=&c;
printf("%d",b);
func(b);
return 0;
}
int func(int a[]){
printf("\n%d",(a));
printf("\n%d",*(a));
printf("\n%d",(a[0]));
printf("\n%d",(a[1]));
printf("\n%d",(a[2]));
}
这是我要了解的这些指针如何与数组一起使用的东西。 这是输出。
-680548828
-680548828
21
21
-680548828
32767
我理解的前两个680548828和两个21s。简单地打印a将是数组a []的第一个元素。 a [0]就像写* a。我没有得到的是为什么a [1]中会有680548828。 a [1]是数组中存储指向21的指针的元素之后的元素(a [0])吗?抱歉给您带来的困惑,请帮忙。谢谢。
解决方法
在您的代码中
printf("%d",b);
在您尝试调用undefined behaviour时尝试使用%d
打印指针。正确的方法是使用
-
%p
格式说明符 - 将参数传递给
void *
相同的逻辑也适用于被调用的函数,请记住,在大多数情况下(包括此特定用法),数组名称会衰减为指向第一个元素的指针,基本上产生指针类型。
也就是说,您正在尝试访问被调用函数中的无效内存。您传递了一个指向int
的指针,然后在被调用的函数中,您尝试通过说a[1]
,a[2]
等来访问存储区域之外的存储器。您无法做到这一点。再次调用未定义的行为。