簡體   English   中英

沒有C的數組和動態列表的指針和算術的指針

[英]pointer to pointer & Arithmetic without array & dynamic list of list in C

(更新)

我們可以在不引用數組的情況下使用指向“指向指針的指針”的指針算法嗎?

例:

int val = 10;
int *b = &val; // UPDATE here:I create a pointer b now
int **a = &b;
**a = 12; //change val's value through a
int *c = (int *)malloc(sizeof(int)); // UPDATE here
*(a+1) = c // Is this OK?

我已經在CLion中進行了嘗試,它可以編譯並且似乎正常工作。 但是我不確定內存泄漏或覆蓋等問題。但是,如果我們可以做到這一點,那么,如果我們想實現一個鏈表,是否可以定義一個指向Node的指針?

struct Node{
  int val;
  Node *next;
}

然后,如果定義Node ** pathList,則可以使用指針算法獲取路徑列表,每個路徑都包含一個Node?列表。

Node **pathList;
Node *firstPath = (Node *)malloc(sizeof(Node));
pathList = &firstPath;
...//add new Node to firstPath..
Node *secondPath = (Node *)malloc(sizeof(Node));
*(pathList+1) = secondPath;// IS THIS LEAGLE?
*(pathList+1) = secondPath;// IS THIS LEAGLE?

是的,這會在您的代碼中引起問題。 因為pathList+1將超過您分配的存儲塊。 並且您取消引用此表達式,將導致未定義的行為。

另外關於您的示例-

int **a;
*a = &val; // a now points to a pointer to val

這也是不正確的 ,因為a 未初始化 ,將其取消引用將再次導致UB。

在這兩種情況下,您都需要先為指針分配內存,然后再執行操作。

就上述arneyCU的答案而言,您毫無疑問根本不希望** “指向指針的指針”語義。 相反,您可能想要這樣:

int *a;
a = &val;

內容如下:

  • a是“指向整數的指針”。
  • 分配給a變量的地址, val

這個語法:

*a = &val;

將被讀取為:

  • 變量val的地址“分配給* a指向的int ”。

...並且C會抱怨您正在為一個整數分配地址值,而沒有使用類型轉換來表示您知道自己在做什么。

是的,C語言確實允許您將任何指針視為數組,例如a[3] ,該數組計算“第三個元素,從零開始計數”的地址。 實際的內存偏移量將是3 * sizeof(*a) 應該強調的是,C語言假定您知道自己在做什么!

我對C內存分配問題進行了一些研究,並為我對指針和數組的困惑找到了一些詳細的解釋。

  1. 當我們執行指針算術時,編譯器真正要做的是將其存儲的地址增加sizeof(type)的數量。 當我們兩次調用malloc時,下一個malloc分配的內存塊不一定緊挨着最后一個。 所以這樣做

    Node *secondPath = (Node *)malloc(sizeof(Node)); *(pathList+1) = secondPath;

我們很危險地覆蓋存儲在地址*(pathList + 1)中的值;

  1. 根據定義,由於連續位於內存中的一個type塊是一個type數組,因此在數組和指針之間產生了一種有趣的關系。

  2. 我們可以執行以下操作:

然后:

int *ptr;    
ptr = (*int) malloc(sizeof(int)*N)

其中N是您需要的元素數。 在此定義之后,您可以像使用常規數組一樣使用ptr。 例如:

ptr [i]

我了解到,為了正確使用指針算法,我們需要首先分配內存。

:-)

一些不錯的參考: Malloc 指針和數組

暫無
暫無

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

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