【问题标题】:C - Reassign pointer inside of struct to pointer outside of structC - 将结构内的指针重新分配给结构外的指针
【发布时间】:2013-02-03 18:02:45
【问题描述】:

我有两个指针,每个指针指向一个不同的数组。其中一个指针位于结构内部,如下所示:

typedef struct
{
    int     N;    /* Number of Elements in array */
    double *c;    /* Pointer to an array         */
    /* Other members....  */
} CS;

结构被初始化:

CS->N = n; /* n is an integer of an initially unknown size */
CS->c = (double *)malloc(n * sizeof(double));

结构中的指针CS->C 包含我不再关心的数据。

我的另一个指针定义如下:

double *alpha;
alpha = (double *)malloc(CS->N * sizeof(double));

我需要将CS->C 的内容替换为alpha。我知道我可以做一些天真的事情,比如:

for (i=0;i<CS->N;i++) /* i is an integer */
    CS->c[i] = alpha[i];

我也可以使用 memcpy,像这样:

memcpy(CS->c,alpha,CS->N * sizeof(double));

我的理解是,这两种方法都会将位于alpha的内存中的内容复制到CS-&gt;C占用的内存中。这是一项非常昂贵的操作,将CS-&gt;C 的分配简单地更改为alpha 会更有意义。

我该怎么做?

我尝试通过像CS-&gt;C = &amp;alpha 一样重新分配指针,但这给了我以下警告“来自不兼容的指针类型的分配”。

注意:这是在完全合规的情况下使用 ANSI C89,即编译器选项是:-Wall -pedantic -ansi

编辑 1
释放CS-&gt;c 并将其分配给alpha

free(CS->c);
CS->c = alpha;

不起作用。它会导致CS-&gt;c 中的每个条目都等于0.0,并导致我的程序段错误。

编辑 2
我想我意识到为什么我第一次编辑中建议的方法不起作用。 alpha 是一个临时指针,在函数内部创建和初始化,因此一旦退出该函数,alpha 占用的内存将被“释放”。由于CS-&gt;c 指向该内存,它也被释放。有了这个发现,我想我会重新编写我的代码,使 alphaCS-c 最初交换,这样当它们再次切换时,最终顺序将是正确的。谢谢大家的宝贵意见。

【问题讨论】:

  • CS->c = (double *)malloc(n * sizeof(*CS->c)); // 而不是 sizeof(double) 所以当你改变你的结构时它不会中断:-)
  • 释放旧数据后简单的 CS->c=alpha 怎么样?
  • @JulienPalard 不,CS-&gt;c = malloc(n * sizeof(*CS-&gt;c)); 而不是CS-&gt;c = (double *)malloc(n * sizeof(*CS-&gt;c));,因为你不应该转换malloc() 的返回值。
  • 如果你喜欢 -Wall -ansi -pedantic 你应该喜欢(和我一样) -Wextra -Wstrict-prototypes ;-)
  • @H2CO3 你是对的 :-)

标签: c arrays pointers struct


【解决方案1】:

只需复制指针

CS->C = alpha;

Alpha 是一个指向 double 的指针,CS->C 也是,类型匹配,你只需更改指针。

/!\别忘了释放旧的CS->C ...

【讨论】:

    【解决方案2】:

    释放旧指针并直接分配新指针。 (不是新指针的地址)

    结构中的指针CS-&gt;c 包含我不再使用的数据 关心。

    我的另一个指针定义如下:

    double *alpha;
    alpha = malloc(CS->N * sizeof(double));
    

    ...

    free (CS->c);
    CS->c = alpha ; alpha=NULL;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2021-11-20
      • 2019-06-26
      • 2020-03-09
      • 1970-01-01
      相关资源
      最近更新 更多