今天被幾個段錯誤,棧溢位,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結構體,其他的儲存的值全是指標。就...