函数somefunction()
将三指针作为参数。
int somefunction(tchar ***returnErrors);
如何为returnErrors
参数分配内存?
答案 0 :(得分:2)
猜测。 。 的
您可以将returnErrors视为指向字符串数组的指针。
为此延迟内存(愚蠢的例子,在SomeFunction内部分配内存)
tchar ** errors;
// Oops it appears I need to pass back two error strings (+ 1 for null on end, so we know there are no more - thanks tlholaday)
errors = malloc(sizeof(tchar*) * 3);
// the first string has length 20 (+ 1 for null terminator)
errors[0] = malloc(sizeof(tchar) * 21);
// the second string has length 30 (+ 1 for null terminator)
errors[1] = malloc(sizeof(tchar) * 31);
// ensure the last is null
errors[2] = 0;
*returnErrors = errors;
注意:调用函数需要知道SomeFunction已分配内存并需要释放它。
答案 1 :(得分:2)
你是实现某些功能还是调用某些功能?
如果你正在调用某个函数,很可能会有一些函数会分配内存,所以你需要做的就是把它传递到一个安全的地方去涂抹并随后清理。
tchar **theErrors = 0; // a vector of tchar vectors.
somefunction(&theErrors);
if (theErrors) {
// use the error values
// free the memory somehow - this is for a null-terminated convention
tchar **victim = theErrors;
while (*victim) delete[](*victim++);
delete[] theErrors;
}
注意:我使用0并删除[]而不是NULL和free,因为标签是c ++。
答案 2 :(得分:1)
这取决于“某种功能”的期望。你必须对此进行调查!
可能需要指向尺寸为2的固定大小数组的指针,或者尺寸为3的常规数组,或者???
在我提到的案例中,代码看起来像
tchar errors[SIZE1][SIZE2];
somefunction( &errors );
或
tchar errors[SIZE1][SIZE2][SIZE3];
somefunction( errors );
答案 3 :(得分:1)
有谁知道如何分配 returnErrors参数的内存?
这个问题过于笼统,在一般情况下无法回答。以下只是一个可能的代码片段示例,用于调用它。
tchar foo;
tchar * p_foo = &foo;
tchar ** pp_foo = &p_foo;
tchar *** ppp_foo = &pp_foo;
somefunction(ppp_foo);
只是评论:我会认为你的功能签名不安全,因此代码闻起来即使它只有一颗星。
另外,请注意:
答案 4 :(得分:0)
如果您还没有该类型的构造,则三重指针不会使任何感觉。我宁愿推荐使用一个类 - 或者至少是一个标准容器。但如果你必须知道,那就像
一样简单tchar ***pointer = (tchar***) malloc(sizeof(tchar**) * amount);
答案 5 :(得分:0)
我会使用像someFunction()这样的函数有两个用例。
初始化:
{
tchar **returnErrors;
initErrors(tchar &returnErrors);
/* now returnErrors has a place in memory*/
}
int initErrors(tchar ***returnErrors)
{
*returnErrors = malloc(sizeof(tchar *) * SIZE1)
for (i = 0; i < NUM_ELEMENTS; i++)
(*returnErrors)[i] = malloc(sizeof(tchar) * SIZE2);
/*add checks for malloc failures*/
}
传递给函数的数组:
{
returnErrors[SIZE1][SIZE2][SIZE3];
someFunciton(returnErrors);
}
int someFunciton(tchar ***returnErrors)
{
/*assuming that this is a valid index*/
tchar x = returnErrors[1][1][1];
/*return errors is used as a triple array*/
}
答案 6 :(得分:0)
我倾向于同意tlholaday的猜测,修改后该函数可能会返回它分配的错误数。
tchar **theErrors = 0; // a vector of tchar vectors.
int nErrors = somefunction(&theErrors);
if (nErrors > 0) {
for (int i = 0; i < nErrors; ++i)
{
printf(theErrors[i]);
free(theErrors[i]);
}
free(theErrors);
}
请注意,您使用free还是delete []将取决于首先如何分配内存。