我一直在使用java很长时间但由于某种原因我需要使用C(ANSI C而不是C ++)来编写一个简单的代码。我需要将指针从外部传递给函数,为指针分配一些内存并在函数返回之前分配一些值。我有像
这样的代码#include <stdio.h>
#include <stdlib.h>
void test(int *a)
{
int n=3;
// I have to call another function t determine the size of the array
n = estimatesize(); // n >=3
// I tried fix size n=10 also
a = (int*)malloc(n*sizeof(int));
a[0] = 1;
a[1] = 2;
a[2] = 3;
}
void main(void)
{
int *s=NULL;
test(s);
printf("%d %d %d", s[0], s[1], s[2]);
}
我不知道为什么代码崩溃了。我认为在开始时它是estimateize()返回错误的数字,但即使我将n修复为10,错误仍然存在。所以我不能传递指向内存分配函数的指针?如果是这样,我如何在函数内动态创建内存并将其传递出去?我知道这可能是一个安全的问题,但我只是想知道它是否可行以及如何做到这一点。感谢。
答案 0 :(得分:2)
有两种解决方案:返回指针来自函数,或者通过引用传递参数。
对于第一个,你只是不接受任何参数,而是返回指针:
int *test(void)
{
int *a = malloc(...);
...
return a;
}
int main(void)
{
int *s = test();
...
}
对于第二个,你需要使用address-of运算符&
传递指针的地址,换句话说是指向指针的指针:
void test(int **a)
{
*a = malloc(sizeof(int) * 3);
for (int i = 0; i < 3; ++i)
(*a)[i] = i;
}
int main(void)
{
int *s;
test(&s);
...
}
它现在不起作用的原因是因为指针(s
中的main
)是通过复制它来传递的。因此函数test
具有本地副本,其范围仅在test
函数中。函数返回后,a
函数中对test
的任何更改都将丢失。并且在为参数复制s
时,这意味着s
中的main
实际上从未改变过值,在函数调用之后它仍然是NULL
。