将指针传递给结构数组时出错

时间:2015-05-07 14:32:08

标签: c arrays function pointers struct

#include <stdio.h>
#include <stdlib.h>

struct Point {
    double x;
};

void test(struct Point **a, int len)
{
    int i;

    printf("a = %p\n", a);
    for (i = 0; i < len; ++i)
        printf("%f\n", a[i]->x);
}

int main()
{
    int i;
    int len = 4;

    struct Point *P;

    P = malloc(len*sizeof(struct Point));

    for (i = 0; i < len; ++i) {
        P[i].x = i;
        printf("%f\n", P[i].x);
    }
    printf("&P = %p\n", &P);
    test(&P, len);

    return 0;
}

我试图将一个结构数组传递给一个函数(我想传递一个指向数组的指针,而不是复制)。当我尝试在函数内部使用数组时,我遇到了访问冲突。这样做的正确方法是什么?我究竟做错了什么? a == &P,所以它应该有效,对吧?

5 个答案:

答案 0 :(得分:5)

为什么你想要struct Point **?您可以重写与

相同的内容
void test(struct Point *a, int len)
{
   //some stuff
    printf("%f\n", a[i].x);

}

并将其称为

 test(P, len);

这样,恕我直言,要求

  

我想传递一个指向数组的指针

也符合

(#)注意:要严格,这里我们将指针传递给数组的第一个元素,但是,行为比较相等。感谢 @alk 先生的评论。

答案 1 :(得分:3)

&p传递给函数test意味着您将指针传递给类型为struct Point *一个元素数组的第一个元素。因此,只有a[0]有效(因此a[0]->x),所有其他a[i]都是有限访问权限。这将调用未定义的行为。

a[i]->x功能中将a[0][i].x更改为(*a)[i].xtest

在这种情况下使用指针指针是不值得的。如果要在函数中修改传递的指针并且预期在调用者中看到修改,则这将是值得使用的。

答案 2 :(得分:1)

应使用参数struct Point *a传递数组。当您递增a时,指针将移动sizeof(struct Point)

void test(const struct Point *a, int len)
{
    ...
}

答案 3 :(得分:1)

其他答案为您提供了更好的选择。但我会把它放在这里帮助任何人(我自己)理解为什么这是错误的。

enter image description here

答案 4 :(得分:0)

  

我想传递一个指向数组的指针

从字面上理解你的要求就是这样:

Set<Path> paths = pList.stream().map(o - > o.path).collect(Collectors.asSet());

for(T obj : eList){
  if(paths.contains(obj.path)){
   ... // rest of your code
  }
}

并称之为:

void test(size_t len, struct Point (*a)[len])
{
  size_t i;

  printf("a = %p\n", (void *) a);

  for (i = 0; i < len; ++i)
    printf("%f\n", (*a)[i].x);
}

您还可以按照 Sourav Ghosh answer提出的方式实现相同的功能(循环遍历数组的元素)。然后你会传递一个指向数组的1 st 元素的指针,但是指向数组本身的指针。