C - 将struct内部的指针重新分配给struct外部的指针

时间:2013-02-03 18:02:46

标签: c arrays pointers struct

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

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->C占用的内存中。这是一项非常昂贵的操作,将CS->C的分配更改为alpha会更有意义。

我该怎么做?

我尝试通过像CS->C = &alpha那样重新分配指针,但是这给了我以下警告“从不兼容的指针类型分配”。

注意:这完全符合ANSI C89,即编译器选项为:-Wall -pedantic -ansi

编辑1
通过执行以下操作释放CS->c并将其分配给alpha

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

不起作用。它会导致CS->c中的每个条目都等于0.0,这会导致我的程序出现错误。

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

2 个答案:

答案 0 :(得分:1)

只需复制指针

即可
CS->C = alpha;

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

/!\别忘了释放旧的CS-&gt; C ...

答案 1 :(得分:0)

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

  

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

     

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

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

...

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