【问题标题】:Pointers to structs and printing指向结构和打印的指针
【发布时间】:2016-05-11 09:25:56
【问题描述】:

我一直在学习结构,我已经找到了指向结构的指针,我目前正在努力解决这个问题。

我有这段代码:

struct point {
    int x;
    int y;
} *ptr;

ptr->x = 8;
ptr->y = 8;

运行它会产生分段错误。我想要做的是将8的值分配给x / y,据我所知,ptr指向它。

【问题讨论】:

  • ptr 指向哪里? (提示:缺少内存分配)
  • @ForceBru malloc(1) 明显不对,应该是sizeof(struct point)
  • @fluter 或者,就此而言,ptr = malloc(sizeof*ptr);
  • @SouravGhosh 是的,我也更喜欢sizeof *ptr
  • 无需将OP与动态内存分配混淆。struct point X; ptr = &X;就足够了。

标签: c pointers struct


【解决方案1】:

你的ptr是一个指向struct point的指针

但是,它没有指向struct point

struct point {
    int x;
    int y;
} *ptr;

struct point pt; // add this...

ptr = &pt;       // ...and this.

ptr->x = 8;
ptr->y = 8;

【讨论】:

    【解决方案2】:

    您创建了一个名为ptr 的指针,但尚未对其进行初始化。当您使用ptr->(或*ptr)取消引用它时,您会调用未定义的行为,在您的情况下会导致程序崩溃(但可以做任何事情)。

    这样会更好:

    struct point {
        int x;
        int y;
    };
    struct point sp = {0,0};
    struct point *ptr = &sp;
    
    sp.x = 8;
    ptr->y = 8;
    

    【讨论】:

      【解决方案3】:

      问题是指针ptr 没有指向任何有效的内存缓冲区,而是将其分配给已分配或自动存储:

      // way 1
      struct point p;
      ptr = &p;
      ptr->x = 8;
      ptr->y = 8;
      
      // way 2
      ptr = malloc(sizeof *ptr);
      ptr->x = 8;
      ptr->y = 8;
      // when you are done remember to release the allocated memory
      free(ptr);
      

      【讨论】:

        【解决方案4】:

        让我给你解释一下简单的方法。

        1.

        变量保存数据(希望它们保存的值),而指针只保存变量的内存地址(只是内存的一部分)。指针仅用于保存变量的地址,因此它们不能保存任何用户数据。我们可以创建一个指向变量的指针并使用特定的指针操作该变量。我们首先需要创建变量,然后我们创建一个引用该变量的指针,然后我们对指针进行任何操作,变量将被操纵。

        struct point 
        {
            int x;
            int y;
        };
        struct point var1;      //declare a variable
        struct point *ptr=&var1;// declare a pointer to that variable
        ptr->x = 8;             // manipulate the variable
        ptr->y = 8;
        

        或者

        2.

        如果你坚持只使用指针,那么你需要动态分配内存,然后将分配的内存的基地址分配给指针。

         struct point 
        {
            int x;
            int y;
        } *ptr;
        
        ptr=(struct point*)malloc(sizeof(struct point)); // this will allocate memory required to hold your structure              
        ptr->x = 8;      //manipulate the memory content pointed by your pointer.       
        ptr->y = 8;
        

        【讨论】:

          【解决方案5】:

          你需要给ptr分配一个有效的内存位置,它是一个指向结构点的指针。您可以使用 malloc,也可以使用 struct point 声明一个变量并将其地址分配给 ptr(如上面的答案)。

          顺便说一句,如果 ptr 具有文件范围,那么它会被初始化为零,即 NULL 指针;否则,评估 ptr 是未定义的行为(您可以获得任何值)。在这两种情况下,尝试取消引用 ptr 都是未定义的行为,因此您可能会遇到段错误(在某些实现中,您可能会无意中修改了某些内存位置)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-06-30
            • 2013-02-15
            • 2023-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多