【问题标题】:c pointer being passed to a functionc指针被传递给函数
【发布时间】:2020-12-10 11:42:22
【问题描述】:
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 和两个 21。简单地打印 a 将是数组 a[] 的第一个元素。 a[0] 就像写 *a。我不明白为什么 a[1] 里面会有 680548828 。 a[1] 是数组中存储指向 21 的指针的元素之后的元素(a[0])?很抱歉造成混乱,请帮忙。谢谢。

【问题讨论】:

  • 打印指针时没有使用兼容的格式。特别是,没有理由假设指针和int 具有相同的大小。使用%p 安全地打印指针值(并将指针转换为void *)。
  • 没有 a[1]a[2] 因为 a 指向单个 int - 这意味着您有未定义的行为。

标签: arrays c pointers printf


【解决方案1】:

在您的代码中

printf("%d",b);

在您尝试使用%d 打印指针时调用undefined behaviour。正确的方法是使用

  • %p 格式说明符
  • 将参数转换为void *

同样的逻辑也适用于被调用的函数,记住,数组名衰减到指向第一个元素的指针,基本上产生一个指针类型,在大多数情况下(包括这个特定的用法)。

也就是说,您正试图访问被调用函数中的无效内存。你传递了一个指向int 的指针,并且在被调用的函数中,你试图通过说a[1]a[2] 等来访问内存区域之外的内存。你不能这样做。它再次调用未定义的行为。

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 2013-09-17
    • 1970-01-01
    • 2011-04-17
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    相关资源
    最近更新 更多