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* 表长度。
按照楼上的做法比较好:
示例很粗糙,实际就是得返回堆上创建的对象,不能是栈上的。