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

标签 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 最初交换,这样当它们再次交换时,最终顺序将是正确的。感谢大家提出的宝贵意见。

最佳答案

只需复制指针

CS->C = alpha;

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

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

关于C - 将结构内部的指针重新分配给结构外部的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14675481/

相关文章:

C - 执行外部循环的函数 - 三消游戏

javascript - 将数组对象推送到新对象

javascript - 初始化大型二维数组的最简洁方法

检查 ISBN 以查看其在 C 语言中是否有效

使用结构创建和扩展链表

c - C中的逻辑运算符和位分离计算(PIC编程)

c++ - main() 在哪里返回它的值?

Java 将文本拆分为 2 个数组

C++:如何返回指向非静态成员函数的指针?

c++ - 转换 "application's"内存地址