char str[100][60] = {0};// 全局变量 char** fun( ) { ...... return str; }
返回值部分怎么写?
学习是最好的投资!
你問的是回傳值類型怎麼寫:
char str[100][60]; typedef char (*str60)[60]; str60 func(){ return str;}
或:
char str[100][60]; char** func(){ return (char **)str;}
看你的要求了原因麼,就是str的類型其實是str60,所以str[1][2]的時候編譯器才能知道存取的位址是str+60*1+2,所指向的一個位元組的數據(char型)。這個和 char** 不是同一個類型,char **裡面不包含資訊60。
str
str60
str[1][2]
str+60*1+2
char**
char **
所以要改成合法的C代碼,就是修改回傳值的型別或是強制型別轉換。
記得返回char**的同時讓呼叫方知道數組的長度,因為char[]退化成char*時失去了數組的長度信息,建議在參數裡加上一個 int* 表長度。
依照樓上的做法比較好:
char** func(int* size1, int* size2) {}
char* fun( ) { char* p = str[0][0]; // do something for( int i = 0;i < 100 ; ++i ) for ( int j = 0; j< 60; ++j ) *(p + 100 * i + j ) = 'a' return p; }
範例很粗糙,實際上就是得返回堆上建立的對象,不能是棧上的。
你問的是回傳值類型怎麼寫:
或:
看你的要求了
原因麼,就是
str
的類型其實是str60
,所以str[1][2]
的時候編譯器才能知道存取的位址是str+60*1+2
,所指向的一個位元組的數據(char型)。這個和char**
不是同一個類型,char **
裡面不包含資訊60。所以要改成合法的C代碼,就是修改回傳值的型別或是強制型別轉換。
記得返回char**的同時讓呼叫方知道數組的長度,因為char[]退化成char*時失去了數組的長度信息,建議在參數裡加上一個 int* 表長度。
依照樓上的做法比較好:
範例很粗糙,實際上就是得返回堆上建立的對象,不能是棧上的。