将c指针传递给函数

问题描述

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]等来访问存储区域之外的存储器。您无法做到这一点。再次调用未定义的行为。