我有一个如此声明的函数:
unsigned char** Classifier::classify(){
//...
unsigned char **chars = new unsigned char *[H];
for(int i = 0; i < H; i++)
chars[i] = new unsigned char[W*3];
//...
return &chars;
//note: when this is "return chars;" I get the following: cannot convert ‘unsigned char*’ to ‘unsigned char**’ in return
这给了我警告:
Classifier.cpp: In member function ‘unsigned char** Classifier::classify()’:
Classifier.cpp:124: warning: address of local variable ‘chars’ returned
这可以忽略吗?基本上,我的问题是如何返回对函数中定义的数组的引用?
我希望能够做到
unsigned char** someData = classify();
答案 0 :(得分:8)
只返回数组,而不是它的地址:
return chars;
&chars
是指向指针的指针,但chars
是指向指针的指针(你想要的)。另请注意,chars
不是数组。指针和数组不是一回事,尽管它们经常混淆。
答案 1 :(得分:4)
从不可以忽略。您将返回本地变量的地址。离开classify()
的堆栈帧时,该地址将无效,在调用者有机会使用它之前
您只需要返回该变量的值:
return chars;
答案 2 :(得分:4)
@Adam Rosenfield得到了正确的答案,所以有一些其他的,(删除那个&符号),但作为思考的食物,一个很好的方法是使用std :: vector(std :: vectors)和将其作为参考参数传递给函数。
#include <vector>
void Classifier::classify(std::vector<std::vector<unsigned char>> & chars)
{
//construct a vector of W*3 integers with value 0
//NB ( this gets destroyed when it goes out of scope )
std::vector<unsigned char> v(W*3,0);
//push a copy of this vector to the one you passed in - H times.
for(int i = 0; i < H; i++)
chars.push_back(v);
}
chars
填充了您想要的内容,在删除vector
时,您不必担心如何调用正确的delete[]
语法在2D数组中对new
的这两次调用。
您仍然可以像使用2D数组一样引用此向量中的项目,例如chars[5][2]
或其他什么。
虽然我可以看到你想要去:
unsigned char** someData = classify();
因此,如果您想使用向量,则必须按如下方式声明someData:
std::vector<std::vector<unsigned char>> someData;
并且可能更清楚:
typedef std::vector<std::vector<unsigned char>> vector2D;
vector2D someData;
classify(someData);
...
答案 3 :(得分:1)
如果在函数中定义了一个数组,并且你想在函数外部使用它 - 你应该将它描述为静态或在函数外部声明一个数组并将其作为参数传递。
< / LI>使用“return chars;”仅;
答案 4 :(得分:0)
不,忽视这个警告是不可行的。您返回的值是堆栈上chars
的地址,而不是它指向的地址。您只想返回chars
。
答案 5 :(得分:0)
其他人给出了答案;但作为一般观察,我建议你看一下STL。你已经标记了问题C和C ++,所以我假设你在C ++环境中并且STL可用。然后,您可以使用typedef以可读形式定义向量,甚至使用向量向量(即2d数组)。然后,您可以将指针或引用(视情况而定)返回到矢量矢量。