Re: [問題] qsort能用在二維array嘛?

看板C_and_CPP作者 (software everywhere)時間14年前 (2010/07/10 00:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《lazybones (懶)》之銘言: : 我現在有一個二維array A[10][10] : 我想把A[0], A[1], A[2].... A[9]利用qsort去做排序 : qsort( A, 10, sizeof(*A), compare ); : 請問這樣寫的問題在哪邊...? 事實上 他是 100個element A[0][0] ... A[0][9] // A[0] 等效 &A[0][0] A[1][0] ... A[1][9] // A[1] 等效 &A[1][0] . . . A[9][0] ... A[9][9] // A[9] 等效 &A[9][0] A 是 [10][10] so *一次 降一階 看到 [10] 所以sizeof(A) 看到全部大小, 100個element size sizeof(*A) == sizeof(A[0]) 看到 10個element 我個人覺得 除了浪費空間外 倒是沒有太大問題 不過優點是 避免多次 alloc mem來放 那 [10] element 比較快 也不容易讓記憶體破碎 使用的sample char str_buf[10][10] = { "Alpha", //事實上是 "Alpha\0\0\0\0\0" "Delta", // "Delta\0\0\0\0\0" "Bravo", "Charlie", //... }; compare function: int comparator ( const void * p1, const void * p2 ) { return strcmp( (char*)p1, (char*)p2) } 然後 main裡面這樣用 qsort( str_buf, sizeof(str_buf)/sizeof(str_buf[0]), // Number of elements sizeof(*str_buf), //Size in bytes of each element comparator); qsort之前 + [0] 0x00417000 "Alpha" char [10] + [1] 0x0041700a "Delta" char [10] + [2] 0x00417014 "Bravo" char [10] + [3] 0x0041701e "Charlie" char [10] + [4] 0x00417028 "" char [10] + [5] 0x00417032 "" char [10] + [6] 0x0041703c "" char [10] + [7] 0x00417046 "" char [10] + [8] 0x00417050 "" char [10] + [9] 0x0041705a "" char [10] qsort 之後 + [0] 0x00417000 "" char [10] + [1] 0x0041700a "" char [10] + [2] 0x00417014 "" char [10] + [3] 0x0041701e "" char [10] + [4] 0x00417028 "" char [10] + [5] 0x00417032 "" char [10] + [6] 0x0041703c "Alpha" char [10] + [7] 0x00417046 "Bravo" char [10] + [8] 0x00417050 "Charlie" char [10] + [9] 0x0041705a "Delta" char [10] -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.26.176.114
文章代碼(AID): #1CDqVJms (C_and_CPP)
文章代碼(AID): #1CDqVJms (C_and_CPP)