0

假设我有以下代码:

typedef otherStruct_t struct_t[X][Y];

void foo1(struct_t * mystruct); //declaration in main()
main()
{
   struct_t mystruct = {0};
   foo1(&mystruct);
   ...
}
void foo1(struct_t * mystruct)
{
   foo2(&mystruct, number);
   ...
}

在其他 .c 文件中。

void foo2(struct_t ** mystruct, int number)
{
   (*mystruct[x][y])-> number = number;
}

我阅读了一些关于结构中指针指针的帖子,这就是我想出的。它可以编译,但调用者结构没有被修改,有时会导致 seg。也有过错。我的错误在哪里?谢谢!

4

2 回答 2

1

有几种方法可以做到这一点。在以下代码中,您可以删除周围的注释

#define NO_PTR_USE 1 

在不使用指针的情况下做到这一点。如果使用指针,那么您必须记住,正如@Oli Charlesworth 指出的那样,[] 的优先级高于 *.

/* #define NO_PTR_USE 1  */

#define X       10
#define Y       10

#define ax      1
#define ay      5

struct foo {
    int number;
};

typedef struct foo struct_t[X][Y];

void
#if NO_PTR_USE
    foo1(struct_t mystruct),
    foo2(struct_t mystruct, int x, int y, int n);
#else
    foo1(struct_t *mystruct),
    foo2(struct_t *mystruct, int x, int y, int n);
#endif

main()
{
    struct_t mystruct = {0};

#if NO_PTR_USE
    foo1(mystruct);
    printf("No pointer was used.\n");
#else                         
    foo1(&mystruct);
    printf("Pointer was used.\n");
#endif                        
    printf("mystruct[%d][%d].number = %d\n",
            ax, ay, mystruct[ax][ay].number);
}

void
#if NO_PTR_USE
foo1(struct_t mystruct)
#else                 
foo1(struct_t *mystruct)
#endif                 
{
    foo2(mystruct, ax, ay, 1234);
}

void
#if NO_PTR_USE
foo2(struct_t mystruct, int x, int y, int n)
#else
foo2(struct_t *mystruct, int x, int y, int n)
#endif
{
#if NO_PTR_USE
    mystruct[x][y].number = n;
#else
    (*mystruct)[x][y].number = n;
#endif
}
于 2013-07-15T01:35:07.143 回答
0

通常,一旦你有了一个指针,你就不会通过地址传递它。想想FILE *fp = fopen(...);。你不使用fprintf(&fp, ...);,是吗?

同样在这里:

typedef struct foo struct_t[X][Y];  // Nasty piece of work - don't do it!

extern void foo1(struct_t *t);
extern void foo2(struct_t *t);

int main(void)
{
    struct_t data = {0};

    ...
    foo1(&data);
    ...
    return 0;
}

void foo1(struct_t *t)
{
    ...
    foo2(t);
    ...
}

其他文件:

void foo2(struct_t *t)
{
    ...
    stuct foo x = (*t)[i][j];
    ...
}    

请注意,astruct_t是结构的二维数组,因此 astruct_t *是指向结构数组的指针。因此,您必须正确获取访问符号,如上所示foo2()。这就是您可能不想使用该类型的原因之一。几乎可以肯定,使用以下方法会更好:

typedef struct bar
{
    struct foo data[X][Y];
} bar;

然后您可以传递bar *bp值,并使用bp->data[i][j].

于 2013-07-15T04:03:14.110 回答