让我的结构是:

typedef struct{
    double x;
    double y;
   } punt;

typedef struct{
    char tip;
    punt infEsq
    punt supDret;
   } rectangle;

typedef struct{
    rectangle *llista;
    int numRect;
    int midaMax;
   } taulaRectangle;


情境化

“平底锅”代表一个观点。

“矩形”,char指示是正方形[q]还是矩形[r],两个点是矩形的左下角点(infEsq)和右上角点(supDret)。

“ TaulaRectangle”映射结构类型为“ rectangle”的列表(或表),指示它具有[numRect]个矩形,以及可以容纳[midaMax]个矩形(如果我没记错的话,它指示[llista]的尺寸) )。

现在,我想编写一个函数来初始化一个指向“ taulaRectangle”的指针,如下所示:

void initaula(taulaRectangle *t,int n) /*n is associated to midaMax*/


我不会发布我的意图来编码有效的初始化函数,因为我相信它们与我想要实现的目标并不接近,尽管这是我尝试过类似尝试的类似情况:

    void inipunt(punt *b){
    b->x=0;
    b->y=1;
    return;
    }
    int main (void){
    double b,n;
    punt *a;
    inipunt(a);
    puts("guay");
    a.x=b;
    a.y=n;
    printf("a.x=%lf a.y=%lf",b,n); /*I know this association is not necessary
                                     but if I directly print a.x a.y it does
                                     not work either, also a fail is *(a.x),*
                                     (a.y) */
    return 0;
    }


编译器(gcc -ansi -Wall)返回:


  final1.c:30:2:错误:请求成员“ x”的内容不是
  结构或联合a.x = b; ^ final1.c:31:2:错误:要求
  成员“ y”(不是结构或联合)a.y = n; ^


综合来说,我希望能够声明一个指向“ taulaRectangle”的指针,并使用“ void initaula()”对其进行初始化,我键入了上面的示例,因为我相信除了“ void inipunt( )”我不必为结构中的指针分配内存,我认为问题的根源在于我如何在我的void函数中处理结构的指针。

很抱歉给您一个长期的问题,如果有人可以帮助,我们将不胜感激。

最佳答案

正如Eugene在评论中指出的那样,未分配指针。

当您执行punt *a;时,您仅分配了指向该结构的指针,但它尚未指向任何内容。尚未初始化。
请检查未初始化的变量,因为它们可能有任何值。您不知道未初始化的指针可能指向什么。

您有两个解决此问题的方法:


通过执行punt a;为堆栈中的结构分配空间。在这种情况下,a是结构。
通过执行punt *a = malloc(sizeof(punt))为堆中的结构分配空间。在这种情况下,a是指向该结构的指针。


如果在堆栈中分配空间,则要获取a的指针,应执行&a
请记住,要访问指针后面的结构,请使用->而不是.

这应该工作:

void inipunt(punt *p) {
    p->x = 0;
    p->y = 1;
}
int main() {
    punt a;
    inipunt(&a);
    printf("%lf %lf\n", a.x, a.y);
    punt *b = malloc(sizeof(punt));  // You should check if it returns NULL, in case of an error.
    inipunt(b);
    printf("%lf %lf\n", b->x, b->y);
    return 0;
}

07-24 09:46
查看更多