-1

在其中一个程序中,我创建了一个函数,它的一个参数是一个指针。该函数为指针动态分配了一些内存,并返回了已分配内存的大小以及其他详细信息。但是,一旦执行该函数,分配的内存就会被销毁。

如何保持函数外部对函数内部分配的内存的访问和数据完整性?

以下是阅读回复后修改的代码:

void initialize(int **arr)
{
  int i = 0;
  *arr = malloc(sizeof(int) * 10);

  for (; i < 10; ++i)
    *arr[i] = i + 1;

  for (i = 0; i < 10; ++i)
    printf("\n%d", *arr[i]);

}

int main()
{

  int i = 0;
  int *arr;
  initialize(&arr);

  for (; i < 10; ++i)
    printf("\n%d", arr[i]);

  return 0;
}

但是当我运行它时,它说“rr.exe 已停止工作”;虽然它编译成功。没有任何东西被打印出来,甚至从函数中的 printf 也没有。

4

2 回答 2

2

不要调用free()动态分配收到的指针,而是将它从函数返回给调用进程。

例子:

#include <stdlib.h> 
#include <stdio.h>    
#include <errno.h>

/* give_me_memory(void ** ppv, size_t n) allocates n bytes to *ppv. */
/* The function returns 0 on success or -1 on error. On error errno is set accordingly. */
int give_me_memory(void ** ppv, size_t n)
{
  if (NULL == ppv)
  {
    errno = EINVAL; /* Bad input detected. */
    return -1;
  }

  *ppv = malloc(n);
  if (NULL == *ppv)
  {
    return -1; /* malloc() failed. */
  }

  return 0; /* Getting here mean: success */
}

int main(void)
{
  void * pv = NULL;
  if (-1 == give_me_memory(&pv, 42))
  {
    perror("give_me_memory() failed");
    return 1;
  }

  /* Do something with the 42 bytes of memory. */

  free(pv);

  return 0;
}
于 2013-09-03T07:20:47.723 回答
1

我猜你的功能看起来像:

void f(int *pointer)
{
    pointer = (int*)malloc(sizeof(int));
}

这很糟糕,因为您的函数获取了指针的副本。想象一下,您的函数将 int 作为参数并更改其值。传递给函数的原始变量不会改变,因为您将它作为副本传递。在这里我们有相同的 - 您可以修改 poitner 指向的内容,但不能修改指针本身。

当我们想将变量传递给函数以便可以在内部进行更改时,我们该怎么办?我们将它作为指针传递。在这里你需要做同样的事情 - 将指针传递给指针:

void f(int **pointer)
{
    *pointer = (int*)malloc(sizeof(int));
}

并这样称呼它:

int *p = 0;
f(&p);
于 2013-09-03T07:26:44.590 回答