【问题标题】:how to pass value to pointer member of a structure [closed]如何将值传递给结构的指针成员[关闭]
【发布时间】:2019-09-26 11:03:24
【问题描述】:

我在内部结构中定义了包含指针成员的嵌套结构。例如,如何将值传递给由 6 个元素组成的数组的指针成员。它正在编译但不工作。

如何给这个指针传值?

        typedef struct
    {
        int Nx;
        int Nu;
        float *x_initial;
    }typeparam;

    typedef struct
    {
        typeparam *param;
    }typeram;

    int main()
    {

        float x0[6]={-2.0,0.0,2.0,0.0,0.0,0.0};
        typeram *ram, ram1;
        ram= &ram1;

       for (int i=0; i<6; i++)
        {
           ram->param->x_initial[i] = x0[i];
          }

         for (int i=0; i<6; i++){
                printf("%1.6f\n",ram->param->x_initial[i] );
         }
        return 0;
    }

【问题讨论】:

  • 怎么不工作了?请阅读How to Ask
  • ram有什么用?为什么不直接使用ram1
  • 并考虑结构中的指针(例如ram1.param)指向的位置。你确定要到处使用指针吗?
  • ram-&gt;param 指向哪里?

标签: c pointers initialization structure


【解决方案1】:

你的代码的问题在于结构内

typedef struct
{
    typeparam *param;
}typeram;

定义了一个指针类型的数据成员

    typeparam *param;

并且它没有被初始化并且具有不确定的值。您必须初始化数据成员,例如为 typeparam 类型的对象动态分配内存并将已分配内存的地址分配给该数据成员。

例如

    #include <stdlib.h>

    //...

    typeram *ram, ram1;
    ram= &ram1;

    ram1.param = malloc( sizeof( typeparam ) );

然后不要在程序结束后释放分配的内存。

   free( ram1.param );

   free( ram->param );

否则程序会因为使用这个具有不确定值的数据成员而产生未定义的行为。

【讨论】:

  • 如何在没有动态内存分配的情况下初始化数据成员?
  • @pva18 与初始化指针 ram 的方式相同。也就是定义一个 typeparam 类型的对象,并将数据成员设置为对象的地址。
【解决方案2】:

让我在这里简化我的代码:

 typedef struct
{
    int Nx;
    int Nu;
    float *x_initial;
}typeparam;

int main()
{

    float x0[6]={-2.0,0.0,2.0,0.0,0.0,0.0};
    //float x;
    typeparam *ram, ram1;
    ram= &ram1;
    ram->x_initial = &x0;
   for (int i=0; i<6; i++)
    {
       ram->x_initial[i] = x0[i];
      }

     for (int i=0; i<6; i++){
            printf("%1.6f\n",ram->x_initial[i] );
     }
    return 0;
}

现在它只是一个结构。我还初始化了两个指针——ram 和 x_initial——我想将 x0 的值分配给 x_initial。上面的代码给出了错误 - 无法从 float* 转换为 float - 不兼容的指针类型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2021-07-17
    • 2012-08-01
    • 2017-08-02
    相关资源
    最近更新 更多