簡體   English   中英

C-將struct內部的指針重新分配給struct外部的指針

[英]C - Reassign pointer inside of struct to pointer outside of 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));

我需要用alpha替換CS->C的內容。 我知道我可以做一些天真的事情,例如:

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 ...

釋放舊指針,然后直接連接新指針。 (不是新指針的地址)

結構體中的指針CS->c包含我不再關心的數據。

我的其他指針定義如下:

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

...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM