函式引數中的多級指標

2021-10-06 05:31:20 字數 1397 閱讀 8305

今天被幾個段錯誤,棧溢位,free不正確的指標的錯誤搞得精力憔悴。

之前對於多級指標+函式引數運用始終有點迷糊,今天果真栽這好幾個跟頭。

這裡呢就是想從mysql中提取出幾個具有相同條件的資料,一行一行填進去就行了…

定義乙個mysqlmsg*cur=null;再用&cur傳入到下面的函式中為cur動態分配記憶體空間。

但是我開始使用這塊記憶體是很理所當然這樣用的。

int

mysqlgetmsgbyuid

(mysql mysql,

int uid,mysqlmsg*

*mmsglist,

int*mnum)

……}

事實上mmsglist[i]這樣相當於*(mmsglist+i),也就是越過了i×num_rows*sizeof(mysqlmsg)這麼大的區間,i>1時超過了我們分配的區間大小。

於是出現了如下的

free(

): invalid pointer

已放棄 (核心已轉儲)

那正確操作是什麼呢???

二重指標先解引用,再偏移i個sizeof(mysqlmsg)再去賦值就沒問題了。

(

*(mmsglist)

+i)->id=

atoi

(row[0]

);(*

(mmsglist)

+i)->type=

atoi

(row[1]

);(*

(mmsglist)

+i)->send_id=

atoi

(row[2]

);strncpy((

*(mmsglist)

+i)->message,row[3]

,mysql_msg_size);(

*(mmsglist)

+i)->status=

atoi

(row[4]

);(*

(mmsglist)

+i)->flag=

atoi

(row[5]

);(*

(mmsglist)

+i)->recv_id=uid;

當然這是因為我是是為*mmsglist分配了記憶體空間,而不是mmsglist,不然之前那個寫法是正確的

又如果是以棧區儲存的如char arglist[10][20]這樣作為函式引數的話,由於此引數真正意義上是char(*arglist)[20]的陣列指標。那麼arglist[i]也就代表著乙個陣列,向這塊記憶體填資料是沒有問題的,它並不會直接跨過乙個二重陣列。

啊,基礎紮實很重要啊!

關於空指標做函式引數和多級指標的使用問題

引入 在主函式中只是定義了乙個空指標p,如何才能通過子函式的呼叫來完成修改p的內容 include include 因為剛開始p什麼都沒有指向 但是p是占有一片記憶體空間的,只是其中的內容為null 所以直接把p的內容傳進子函式賦值是沒有意義的,相當於在子函式中改變了指向了一片新的儲存空間,修改的是...

指標陣列,陣列指標,函式指標,指標函式,多級指標

int a 10 定義乙個指標陣列,該陣列共有10個元素,每個元素均是乙個int型指標。int a 10 定義乙個陣列指標。該指標指向乙個含有10個元素的陣列的位址。即指向二維陣列的指標。通常如果要修改乙個二維陣列的值時,需要定義乙個陣列指標作為函式引數。或者 int a 10 作為形參。int b...

多級指標的用途

多級指標你可以看成是乙個樹,每個節點都可以是乙個小樹,想找到每層節點的時候只能通過指標偏移確定,除非你知道他們具體的各級座標,否則無法直接定位。舉個例子stra tree 這個tree其實就是個位址值,不僅如此,這個大樹後面只有 tree 這層節點儲存的值是stra結構體,其他的儲存的值全是指標。就...