看板 C_and_CPP 關於我們 聯絡資訊
我寫了好久,最後全刪掉。 該補的是幾個重點 #define N 2 #define LEN 10 void func1(char *p[LEN]) { for(int i=0; i!=N; ++i) puts(p[i]); } 實際上進去的時候, char *p[LEN] 是看做 char** p, 所以用 char *str_arr_p[LEN] = {"aa", "bb"}; char str_2dim[N][LEN] = {"aa", "bb"}; char **str_heap = (char**)malloc(sizeof(char*)*N); /* initialize for str_heap */ func1(str_arr_p); func1(str_heap); 這兩個都可過。但若是用 char buf[N][LEN]; func1(buf); 這不會過, 最後會死在 (隱含呼叫 strlen.asm) 裡面。 ------ 吊脆的地方又在於若非以 C-style 方式去傳 void funci1(int *ptr[LEN]) { int i, j; for(i=0; i!=N; ++i) { for(j=0; j!=LEN; ++j) printf("%d ", ptr[i][j]); putchar('\n'); } } 上面的 int* ptr[LEN] 還是看做 int** int *int_arr_p[LEN] = {1, 2}; int int_2dim[N][LEN] = {1,2}; int **int_heap = (int**)malloc(sizeof(int)*N); /* init for int_heap */ 最後,這裡只有 int_heap 會過,這是我認為 C-Style String 吊脆的地方。 ----- 我只是想表達,C 語言在探討 pointer / array 時, string 部份最後全都拉出來做差別式的思考, 我看到很多特例在裡面。 -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41
purpose:func1(buf); 這裡不會過是正常的,因為 func1 對應的陣列 09/10 00:42
purpose:是一維的char *p[10],可是buf是二維陣列 09/10 00:43
LPH66:你的兩個例子之間的類比怪怪的... 09/10 00:44
LPH66:字串 "Hello" 就是一個字元陣列 {'H','e','l','l','o','\0'} 09/10 00:44
LPH66:這樣下去思考或許能解開你的一些疑問 09/10 00:44
purpose:後面這個也不算特例,因為 int_arr_p 裡面每個元素是指標 09/10 00:46
purpose:可是進了 funci1 之後,你的 ptr[0] 就會是指標,位址為1 09/10 00:47
purpose:因此接著運算出 ptr[0][0] 時相當於對位址0做 * 取值運算 09/10 00:48
purpose:而 char * 之所以過關,是因為編譯器對於 string literal 09/10 00:48
purpose:比如 "123" 他先是另外拉一塊空間去存,比如存在 0x4000 09/10 00:48
purpose:然後再把0x4000這個指標值,當作元素內容 09/10 00:49
tropical72:感謝 p 大與 L 大指正說明.array of pointer 值得細思. 09/10 01:00
purpose:打錯了,改 相當於對位址1做 * 取值運算 09/10 01:00