在其中一个程序中,我创建了一个函数,其中一个参数是一个指针。该函数动态地为指针分配了一些内存,并返回已分配内存的大小以及其他详细信息。但是,一旦执行该函数,就会销毁分配的内存。
如何将函数外部的访问和数据完整性保留在函数内部分配的内存中?
以下是阅读回复后修改的代码:
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。
答案 0 :(得分: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;
}
答案 1 :(得分: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);