[問題] 大約一半機率會記憶體錯誤的字串處理函式

看板C_and_CPP作者 (800IM)時間9年前 (2016/10/06 11:37), 9年前編輯推噓3(3014)
留言17則, 5人參與, 最新討論串1/2 (看更多)
這個 function 主要是將自己寫的 Key&Value struct link list 串成一個 QueryString 大約一半機率會發生如下錯誤: *** Error in `/home/lky/workspace/*******************': free(): invalid next size (normal): 0x00000000021297e0 *** 想請版友幫忙診斷一下,是不是哪邊記憶體處理有缺失? //用來組合 QueryString 的 node struct listKeyValuePair { char* strKey; char* strValue; //Link list struct listKeyValuePair* perv; struct listKeyValuePair* next; }; //用來把 listKeyValuePair 已經串起的整個 Link List 轉換成單一 QueryString char* ConvertToQueryString(struct listKeyValuePair* node) { char* strQueryString = (char*)calloc(sizeof(char),0); while(NULL != node) {//一個接一個按照QueryString格式串上去 size_t newLength = strlen(strQueryString)+strlen(node->strKey)+strlen(node->strValue)+3; strQueryString = (char*)realloc(strQueryString, newLength); if(NULL == node->perv) {//第一個 sprintf(strQueryString, "%s=%s",node->strKey, node->strValue); } else {//第二個以後 sprintf(strQueryString, "%s&%s=%s", strQueryString, node->strKey, node->strValue); } node = node->next; } //puts(strQueryString); return strQueryString; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.205.43 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1475725074.A.177.html

10/06 11:46, , 1F
向calloc申請0個位置?
10/06 11:46, 1F
因為想要確保是'\0'結尾空字串,不然會是亂七八糟的內容

10/06 11:48, , 2F
而且參數前後好像放錯了,小弟亂猜的
10/06 11:48, 2F
※ 編輯: deo2000 (125.227.205.43), 10/06/2016 11:49:43

10/06 11:52, , 3F
記憶體那麼便宜了,不用那麼節檢吧XDXD
10/06 11:52, 3F

10/06 12:02, , 4F
用snprintf
10/06 12:02, 4F
謝謝,照改之後就不會記憶體錯誤了。但我現在還看不出原因? 但是改了以後QueryString就會無法串起,return 只會剩下最後那一對,也還在找原因

10/06 12:12, , 5F
看了一下所以你一直realloc嗎 為何不算長度一次配完記
10/06 12:12, 5F

10/06 12:12, , 6F
憶體
10/06 12:12, 6F
因為想把他寫得有彈性,看list多長字串就長到哪裡 ※ 編輯: deo2000 (125.227.205.43), 10/06/2016 12:29:30

10/06 12:30, , 7F
13誡之6
10/06 12:30, 7F
free 掉就沒有東西可以 return 了耶? ※ 編輯: deo2000 (125.227.205.43), 10/06/2016 12:33:01 ※ 編輯: deo2000 (125.227.205.43), 10/06/2016 12:47:33

10/06 13:05, , 8F
calloc(1,0)回傳值是什麼呢,沒空間的空間,三次元嗎
10/06 13:05, 8F
就"\0"

10/06 13:11, , 9F
而且return字串的char*真的很少見的寫法,有創意
10/06 13:11, 9F

10/06 13:13, , 10F
正常應該是把字串空間先創好,在給進含數的參數運用
10/06 13:13, 10F
※ 編輯: deo2000 (125.227.205.43), 10/06/2016 13:26:24

10/06 13:35, , 11F
樓上好像講到重點了: calloc 的參數是 (個數, 元素大小)
10/06 13:35, 11F

10/06 13:36, , 12F
並不是 (總長度, 內容值), 所以應該要寫 calloc(1,1) 才對
10/06 13:36, 12F

10/06 13:36, , 13F
calloc 一定會填 0 所以也不用自己寫 0
10/06 13:36, 13F

10/06 13:37, , 14F
原 PO 你試試最一開始的寫法但把 (1,0) 換成 (1,1) 看看
10/06 13:37, 14F

10/06 13:38, , 15F
newLength 其實只要 +1 即可, 但 +3 其實也無妨就是
10/06 13:38, 15F

10/06 13:38, , 16F
咦不對, 我錯了...你有中間連接的字串所以需要 +3 沒錯
10/06 13:38, 16F

10/19 04:11, , 17F
安安有沒有試過valgrind?
10/19 04:11, 17F
文章代碼(AID): #1NzSSI5t (C_and_CPP)
文章代碼(AID): #1NzSSI5t (C_and_CPP)