[問題] 指標陣列的size是不一致的嗎?

看板C_and_CPP (C/C++)作者 (FreedomKnight)時間13年前 (2012/10/13 21:18), 編輯推噓5(5030)
留言35則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux gcc 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 我打算用一個point to array 字串指標陣列 的結構丟到bsearch裡頭 但是結果怎麼跑都不對 所以我在想會不會是給bearch 的size不對 因此我做了一小串實驗 先是檢查我傳入的 sizeof(char*)結果出來size 是為8 接著如下程式碼 1 #include <stdio.h> 2 char *str[] = { 3 "hello", 4 "fine", 5 "thanks", 6 "nice", 7 "good" 8 }; 9 10 int main() 11 { 12 13 int i = 0; 14 for (i = 0; i < 5; i++) { 15 printf("%p\n", &str[i]); 16 } 17 return 0; 18 } 我預想的結果應該是 &str[0] &str[1] &str[2]... 之間的記憶體位置都要差8 0x600920 0x600928 0x600930 0x600938 0x600940 這個結果竟然8、2相間 請問這是什麼原因呀? 是什麼對齊之類的嗎?為了大量的數據結果也是如此 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.81.93.228

10/13 21:18, , 1F
16進位...
10/13 21:18, 1F

10/13 21:19, , 2F
位址是十六進制
10/13 21:19, 2F

10/13 21:27, , 3F
對不起我蠢了 我在這之間還加過16進位說 想說要是E結尾
10/13 21:27, 3F

10/13 21:28, , 4F
真是對不起 我會在研究 不過想順便問一下
10/13 21:28, 4F

10/13 21:28, , 5F
樓上錯誤
10/13 21:28, 5F

10/13 21:28, , 6F
我說二樓
10/13 21:28, 6F

10/13 21:29, , 7F
丟到bsearch的size用sizeof(char*)對嗎?
10/13 21:29, 7F

10/13 22:40, , 8F
array的間隔不一定會是連續的吧?
10/13 22:40, 8F

10/13 22:43, , 9F
array 裡面是連續的
10/13 22:43, 9F

10/14 00:10, , 10F
array裡面一定是連續的 這應該是沒問題
10/14 00:10, 10F

10/14 00:11, , 11F
我想現在是bsearch的void cast 成pointer我是有問題的
10/14 00:11, 11F

10/14 01:01, , 12F
目前發現是我的compar是
10/14 01:01, 12F

10/14 01:02, , 13F
return strcmp(*(char**)str1, *(char **) str2);
10/14 01:02, 13F

10/14 01:02, , 14F
~><~慘了我觀念不對
10/14 01:02, 14F

10/14 01:04, , 15F
因為傳入是const void *str1, const void *str2
10/14 01:04, 15F

10/14 01:06, , 16F
所以*(char**) str2是對的,問題好像在str1這應該是key
10/14 01:06, 16F

10/14 01:09, , 17F
所以我傳bsearch("fine",test,5,sizeof(char*),compar)
10/14 01:09, 17F

10/14 01:10, , 18F
"fine"在compar出錯 不能*(char**)str1 叫出來
10/14 01:10, 18F

10/14 01:11, , 19F
實驗結果 return strcmp(str1,*(char **)str2);才對
10/14 01:11, 19F

10/14 01:14, , 20F
只是現在我有點似懂非懂,為何*(char**)不能
10/14 01:14, 20F

10/14 01:39, , 21F
1. bsearch 必須保證,內容有排序過,很明顯你給的 demo
10/14 01:39, 21F

10/14 01:40, , 22F
沒有. 2. 先做搜尋 int [], 成功後再想想 char *str[] 記
10/14 01:40, 22F

10/14 01:41, , 23F
憶體長怎樣,接下來再細思怎麼寫才對. 亂踹總得不到你要的,
10/14 01:41, 23F

10/14 01:41, , 24F
debugger 會是你的好工具..
10/14 01:41, 24F

10/14 01:50, , 25F
抱歉 這是我刪修過的 只是為了PO上來的
10/14 01:50, 25F

10/14 01:50, , 26F
這忘了排序 抱歉
10/14 01:50, 26F

10/14 01:52, , 27F
我想我的key應該只是個字串只能用一個pointer
10/14 01:52, 27F

10/14 01:53, , 28F
結果耍白模仿了str2的作法point兩次
10/14 01:53, 28F

10/14 01:55, , 29F
但是char *str[] 本來就是char** 所以我在耍蠢
10/14 01:55, 29F

10/14 01:55, , 30F
感謝各位幫忙
10/14 01:55, 30F

10/14 02:15, , 31F
以你的例子 str 型別為 char[5] 所以在傳的時候會轉成
10/14 02:15, 31F

10/14 02:15, , 32F
char** ^*
10/14 02:15, 32F

10/14 03:11, , 33F
嗯 感謝大大解釋,所以我的*(char**)會正常運作
10/14 03:11, 33F

10/14 03:12, , 34F
然而str1是"fine"這個key 單純只是個字串
10/14 03:12, 34F

10/14 03:13, , 35F
我卻望想用 *(char**)控制他 我是這樣理解的
10/14 03:13, 35F
文章代碼(AID): #1GUMeYO4 (C_and_CPP)
文章代碼(AID): #1GUMeYO4 (C_and_CPP)