繁体   English   中英

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

[英]Error when passing pointer to array of structs

#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 ,所以它应该工作,对吗?

你为什么想要一个struct Point ** 你可以改写相同的

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

}

并称之为

 test(P, len);

这样,恕我直言,要求

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

也遇到了


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

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

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

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

应使用参数struct Point *a传递数组。 当你增加a指针将被移动sizeof(struct Point)

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

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

在此输入图像描述

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

从字面上看你的要求你这样做:

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);
}

并称之为:

size_t len = 4;
struct Point * p = malloc(len * sizeof *p);

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

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

test(len, &p);

您也可以按照Sourav Ghosh回答提出的方式实现相同的功能(循环遍历数组的元素)。 然后,您将传递指向数组的第一个元素的指针,但是指向数组本身的指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM