【问题标题】:C, two kinds of functionsC、两种功能
【发布时间】:2014-06-16 16:46:38
【问题描述】:

我总是看到如下两种函数:

void Function_1(
    int** buff
    )
{
    int* retNb = null;
    retNb = (int*) malloc(42 * sizeof(int));
    *buff = retNb;
}

void Function_2(
    int* retNb
    )
{
    retNb = (int*) malloc(42 * sizeof(int));
}

function_1function_2 有什么区别?它们的用例是什么?

【问题讨论】:

  • 我猜是个坏例子。第二个函数只做内存泄漏。
  • 它们应该是相同的,技术差异是一个是指针数组,你刚刚将第一个元素设置为 int[42],另一个只是一个指针,你已经分配它有 42 个元素。

标签: c pointers function-pointers


【解决方案1】:

一个非常大的区别,他们真的不同 - 无论如何。 让我们保持简单:

 void Function_1(int** buff)

函数 1 中的参数是一个指向名为 buff 的 int 指针的指针,该函数的作用如下:

int* retNb = null;

声明一个名为 retNb 的 int 指针,这里实际上没有必要对 NULL 赋值,因为下一行如下:

retNb = (int*) malloc(42 * sizeof(int));

调用retNb 以获取从malloc 返回的值。 malloc 在内存中分配了42*sizeof(int) 位置并将其返回给retNb,现在它可以被视为一个包含42 个整数的简单数组,并且可以用方括号[] 访问为retNb[i]

*buff = retNb;

in pointers * 是获取变量中地址内容的方法(在本例中为变量 == 指针),因此当使用 *buff 时,buff 为 **buff(指向指针的指针)您实际上是在要求指向 buff 的指针。假设我们有代码:

int** myPointerToPointer = NULL;
int* myPointer = malloc(sizeof(int));
*myPointer = 4; //or myPointer[0] = 4;
printf("%d\n", *myPointer);
myPointerToPointer = &myPointer;
printf("%d\n", *(*myPointerToPointer));
printf("%d\n", &myPointer);
printf("%d\n", *myPointerToPointer);

那么输出将是:

4
4
SOME_ADDRESS
SAME_ADDRESS

因为第一次打印的是myPointer(4)的值,第二次是myPointerToPointer的值,它的值是myPointer,它的值是4:P 第三和第四个输出是相同的两个,因为myPointer 的地址实际上是myPointerToPointer 指向的位置。

关于第二个功能:

void Function_2(int* retNb)

它得到一个 int 指针——不是指向指针的指针——只是一个指针——意味着它包含一个整数变量的地址,可以使用操作符 * 访问。

retNb = (int*) malloc(42 * sizeof(int));

这一行正在分配动态内存(再次 42 次 sizeof(int)),现在可以被视为具有 42 个点的常规 int 数组 - 但这是它唯一做的事情,它没有任何指向它,只是分配内存,就是这样。

希望你能理解:P

【讨论】:

    【解决方案2】:

    在函数中,两个 u 有一个指向 42 个整数数组的指针。 int function 1 你设置 buff 指向这个数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      相关资源
      最近更新 更多