为三指针分配内存

时间:2009-02-12 10:54:38

标签: c++ c pointers

函数somefunction()将三指针作为参数。

int somefunction(tchar ***returnErrors);

如何为returnErrors参数分配内存?

7 个答案:

答案 0 :(得分:2)

猜测。 。

您可以将returnErrors视为指向字符串数组的指针。

  1. 第一个* implementss指向数组的指针 of tchar(或单个字符串 返回tchars)
  2. 第二个*实现了一个指针 字符串数组。
  3. 最后一个*是你可以改变的 returnErrors并传回新的 存储器中。
  4. 为此延迟内存(愚蠢的例子,在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);

只是评论:我会认为你的功能签名不安全,因此代码闻起来即使它只有一颗星。

另外,请注意:

  • 指针永远不是数组。它是一个 包含值的变量 内存地址,或NULL。
  • 指针包含的地址 并不总是对应于 数组的起始地址。 int ** p并不总是指的是 int [] []的起始地址。
  • 一个值包含的指针 数组的起始地址不是 将此数组作为传递的最佳方法 功能参数。相反,可以使用对数组类型的引用。
  • 数组通常不是在C ++中包含一组相关值的最佳方法。应考虑std :: vector和其他STL容器。 (但是你的问题有两种语言,C和C ++,作为标签;当然这只适用于后一种可能性。为什么这两个标签?)

答案 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 []将取决于首先如何分配内存。