C递归函数中作为引用传递的数组的动态内存分配

C递归函数中作为引用传递的数组的动态内存分配,c,memory,dynamic,recursion,allocation,C,Memory,Dynamic,Recursion,Allocation,我想计算我的递归嵌套了多少,并返回函数内部创建的数组中的每个级别数,但该代码不能正常工作(运行时显示“分段错误”): 无效测试(int*结果[],int*计数器){ 如果(*计数器==0) *结果=(int**)malloc(0); 如果(*计数器==5) 返回; 否则{ *计数器=*计数器+1; *结果=(int**)realloc(*结果,sizeof(int)*(*计数器)); *结果[*计数器-1]=*计数器;//这行是错误的,我不知道为什么。 测试(结果、计数器); } } 空干管()

我想计算我的递归嵌套了多少,并返回函数内部创建的数组中的每个级别数,但该代码不能正常工作(运行时显示“分段错误”):

无效测试(int*结果[],int*计数器){
如果(*计数器==0)
*结果=(int**)malloc(0);
如果(*计数器==5)
返回;
否则{
*计数器=*计数器+1;
*结果=(int**)realloc(*结果,sizeof(int)*(*计数器));
*结果[*计数器-1]=*计数器;//这行是错误的,我不知道为什么。
测试(结果、计数器);
}
}
空干管(){
int**结果;
int计数器=0;
测试(结果和计数器);
int i;
对于(i=0;i<5;i++)
printf(“%d\n”,*结果[i]);
}
我知道我可以使用单指针作为参数和返回值来实现。关键是,我只是好奇。

test()的代码在我看来表面上还行(我没有测试它,所以我不能肯定),但这在
main()中是错误的。

应该是:

(*result)[*counter - 1] = *counter;
test()
的代码在我看来表面上还行(我没有测试它,所以我不能肯定),但在
main()
中这是错误的:

应该是:

(*result)[*counter - 1] = *counter;

列出所有可疑或错误的线路,并说明原因:

*result = (int**) malloc(0);
该行要么将
*结果
设置为
0
,要么设置为某个唯一值,该值必须为
自由
d。此外,强制转换是多余和错误的,因为
*result
具有类型
int*

*counter = *counter + 1;
以上为标准增量运算符喊叫:
++*计数器

*result = (int**) realloc(*result, sizeof(int) * (*counter));
void main () {
除了上面用
malloc
标识的类型和类型转换问题外,最好以这种方式编写,以避免使用错误的大小:
*result=realloc(*result,*counter*sizeof*result)

运算符优先级意味着您需要添加括号:
(*结果)[*计数器-1]=*计数器

*result = (int**) realloc(*result, sizeof(int) * (*counter));
void main () {
main的唯一幸运原型是
intmain(void)
intmain(intargc,char*argv[argc])
或兼容。实现可能也允许其他实现,尽管它们是不可移植的

int** result;
x此处需要一个
int*
,因为您希望将其用作
test
的参考参数

test(result, &counter);
注释x表示您需要获取上述
result
的地址

for (i = 0; i < 5; i++)

删除取消引用以获得良好的结果,如注释x所示。

所有可疑或错误行的摘要,并说明原因:

*result = (int**) malloc(0);
该行要么将
*结果
设置为
0
,要么设置为某个唯一值,该值必须为
自由
d。此外,强制转换是多余和错误的,因为
*result
具有类型
int*

*counter = *counter + 1;
以上为标准增量运算符喊叫:
++*计数器

*result = (int**) realloc(*result, sizeof(int) * (*counter));
void main () {
除了上面用
malloc
标识的类型和类型转换问题外,最好以这种方式编写,以避免使用错误的大小:
*result=realloc(*result,*counter*sizeof*result)

运算符优先级意味着您需要添加括号:
(*结果)[*计数器-1]=*计数器

*result = (int**) realloc(*result, sizeof(int) * (*counter));
void main () {
main的唯一幸运原型是
intmain(void)
intmain(intargc,char*argv[argc])
或兼容。实现可能也允许其他实现,尽管它们是不可移植的

int** result;
x此处需要一个
int*
,因为您希望将其用作
test
的参考参数

test(result, &counter);
注释x表示您需要获取上述
result
的地址

for (i = 0; i < 5; i++)

删除取消引用以获得良好的结果,正如注释x所说。

“无法正常工作”不是一个有用的描述。请解释您正在观察的行为以及您期望的行为。此外,不要添加多余的强制转换(例如用于返回
malloc
)。只在需要正确程序的地方强制转换,永远不要关闭编译器。使用
-Wall-Wextra
向编译器询问所有警告,并进行适当处理<代码>*结果
不是一个
int**
顺便说一句。为了你自己的利益,试着把
-Wall
作为一种习惯来编译你的代码:它会在这里和那里显示你所有的小错误;例如使用
int**
作为
int*
值的强制转换;
main
缺少整数返回(并且
main
的原型也错误),或者初始化的
result
变量。关于这一点,它将是值得的
malloc
it,因为它可以在代码的当前状态下随机地划分错误;将其更正为
-Wall
将表明(例如,使用
int**result=NULL;
)将显示它存在故障,但不是随机的,因此您可以更正它;)使用
malloc(0)
即使是偶然也不是好主意;明确地写出来是一个非常糟糕的主意。您不能取消引用可靠返回的任何指针。“不能正常工作”不是一个有用的描述。请解释您正在观察的行为以及您期望的行为。此外,不要添加多余的强制转换(例如用于返回
malloc
)。只在需要正确程序的地方强制转换,永远不要关闭编译器。使用
-Wall-Wextra
向编译器询问所有警告,并进行适当处理<代码>*结果
不是一个
int**
顺便说一句。为了你自己的利益,试着把
-Wall
作为一种习惯来编译你的代码:它会在这里和那里显示你所有的小错误;例如使用
int**
作为
int*
值的强制转换;
main
缺少整数返回(并且
main
的原型也错误),或者初始化的
result
变量。关于这一点,它将是值得的
malloc
it,因为它可以在代码的当前状态下随机地划分错误;并将其更正为
-Wall
将表明(例如,具有
int**result=NULL;
)将