作者tropical72 (藍影)
看板C_and_CPP
標題Re: [問題] function中傳入指標型態問題
時間Sat Sep 10 00:26:21 2011
我寫了好久,最後全刪掉。
該補的是幾個重點
#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