0

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

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这是一个非常昂贵的操作,简单地更改to的分配会更有意义alpha

我怎样才能做到这一点?

我试图通过 like 重新分配指针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最初被交换,这样当它们再次切换时,最终顺序将是正确的。谢谢大家的宝贵意见。

4

2 回答 2

1

只需复制指针

CS->C = alpha;

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

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

于 2013-02-03T18:09:47.597 回答
0

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

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

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

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

...

free (CS->c);
CS->c = alpha ; alpha=NULL;
于 2013-02-03T18:07:28.457 回答