我在C ++中有以下功能:
char** f()
{
char (*v)[10] = new char[5][10];
return v;
}
Visual Studio 2008表示如下:
error C2440: 'return' : cannot convert from 'char (*)[10]' to 'char **'
为了使这个功能起作用,返回类型究竟应该是什么?
答案 0 :(得分:16)
char**
与char (*)[10]
的类型不同。这两者都是不兼容的类型,因此char (*)[10]
无法隐式转换为char**
。因此编译错误。
该函数的返回类型看起来非常难看。你必须把它写成:
char (*f())[10]
{
char (*v)[10] = new char[5][10];
return v;
}
现在compiles。
或者您可以将typedef
用作:
typedef char carr[10];
carr* f()
{
char (*v)[10] = new char[5][10];
return v;
}
基本上,char (*v)[10]
定义了一个指向大小为10的char
数组的指针。它与以下内容相同:
typedef char carr[10]; //carr is a char array of size 10
carr *v; //v is a pointer to array of size 10
所以你的代码就等同于:
carr* f()
{
carr *v = new carr[5];
return v;
}
cdecl.org
在这里有所帮助:
char v[10]
读为declare v as array 10 of char
char (*v)[10]
读为declare v as pointer to array 10 of char
答案 1 :(得分:13)
指向指针的指针与指向数组的指针不同。
(特别注意sizeof(*ptr1)
是sizeof(char)*6
的方式,而sizeof(*ptr3)
是sizeof(char*)
- 这会对指针算法造成严重后果。)
new char[5][10]
给你一个char (*)[10]
(顺便说一下,它与函数指针完全无关),因为指针和字符在内存中以这种方式排列(我的第二个例子)
不与char**
(代表不同的布局)相同,因此两者之间的转换毫无意义;因此,它是不允许的。
所以你的函数的返回类型必须是char (*)[10]
:
char (*f())[10] {
char (*v)[10] = new char[5][10];
return v;
}
当然,这真的很难看,所以你使用std::vector<std::string>
会好得多。
This FAQ entry在“转化”标题下解释得最好。
答案 2 :(得分:5)
因为char**
和char (*)[10]
是两种不同的类型。 char**
是指向指针(指向char
)的指针,而char (*)[10]
是指向char
的数组(大小为10)的指针。结果,char**
的移动步骤是sizeof(void *)
个字节,在win32平台上是4个字节,而char (*)[10]
的移动步骤是sizeof(char) * 10
字节。
示例强> 的
char *c = NULL;
char **v = &c;
cout << typeid(v).name() << endl;
cout << (void*)v << endl;
v += 1;
cout << (void*)v << endl;
char d[10];
char (*u)[10] = &d;
cout << typeid(u).name() << endl;
cout << (void*)u << endl;
u += 1;
cout << (void*)u << endl;
的输出强> 的
char * *
0034FB1C
0034FB20
char (*)[10]
001AFC50
001AFC5A
使用char (*)[10]
作为函数的返回类型(或函数的输入/输出参数),最简单,最易读的方法是使用typedef
:
// read from inside-out: PTRTARR is a pointer, and, it points to an array, of chars.
typedef char (*PTRTARR)[10];
请注意,如果不小心,它很容易与 指针 的typedef
混淆:
// operator[] has higher precedence than operator*,
// PTRARR is an array of pointers to char.
typedef char *PTRARR[10];
的参考强> 的