【发布时间】:2012-01-12 10:56:04
【问题描述】:
我正在尝试调用一个以 char** 作为参数的函数。它的工作是填充字符串数组(即 char* 数组)。我知道字符串的最大长度,我可以将要填充的最大数量作为另一个参数传递,所以我希望像这样堆栈分配它:
fill_my_strings(char** arr_str, int max_str); // function prototype
char fill_these[max_strings][max_chars_per_string]; // allocating chars
fill_my_strings(fill_these, max_strings); // please fill them!
当然,我收到“无法将 char[max_strings][max_chars_per_string] 转换为 char**”错误。
我知道这是一些微妙(或不那么微妙)的问题,因为我对数组和指针之间的区别的理解。我只是不确定为什么不能将这块内存传递给想要一个 char** 的东西并让它填充我的堆栈分配的字符。有人可以解释一下这是否可行,如果不可行,为什么不呢?
不调用malloc/new可以调用这样的函数吗?
【问题讨论】:
-
您可以将
char[][]传递给期望char**的函数,但如果您试图在堆栈上给它们指针,一旦函数结束,这些指针将指向无效位置。您需要在堆上分配内存。 -
¤
fill_my_strings需要一个指针数组,每个指针都指向一个数组。所以这就是你必须给它的。您可以只声明一个std::vector<char*> v,使用循环指向push_back指针(其中每个指针指向矩阵的相关部分),然后传递&v[0]。干杯&hth., -
@AlfP.Steinbach 是的,您的回答是可以接受的。我唯一担心的是,从历史上看,我不相信向量内存实际上保证是连续的。我以前读过一些关于它的条目,似乎它们基本上总是如此,但是通过将指针传递给这样的向量来假设这样的风格似乎很糟糕......虽然我确实喜欢你的解决方案,但没有显式的堆调用,让它变得漂亮:)
-
@RomanB: Re "Why don't you put your cmets as answers?", well the SO community, via its self-appointed and its elected leaders, have made it clear that any answers from me包括最后一句“cheers & hth.”之类的告别词是非常不受欢迎的。在前一周,由于我坚持“Cheers & hth.”,我被停职一周,尽管这个决定在一小时左右就被推翻了。此外,我的一个(正确)答案因太短而被删除。无论如何,通过发表评论,我避免了整个麻烦事,直到他们也开始删除 cmets...干杯,
-
@AlfP.Steinbach 感谢史蒂夫和您自己澄清这一点。在这种情况下,似乎没有比 Alf 更好的解决方案了!如果您希望 Alf,请随时将您的解决方案作为实际答案发布。我可能会看看其他人是否有任何天才条目,但如果不是这样,我可能会接受你的解决方案。谢谢!
标签: c++ c arrays pointers char