我是指针数组的新手(将函数放入数组)并使用 malloc 为其分配内存。你能帮我处理这段代码吗?有函数:int comp_int(int a, int b); int comp_int_abs(int a, int b); int comp_int_length(int a, int b); int comp_int_digits_sum(int a, int b);
并希望将指向这些函数的指针放在指针数组中。首先想为数组动态分配内存并将函数的指针放入其中。卡在这个地方,我做错了什么?
int (**funcs)(int, int) = malloc(4*sizeof(int));
if(!*funcs)
{
printf("Failed to allocate memory");
return 8;
}
*funcs={add_int, sub_int, div_int, mul_int};
首先,为什么要分配动态内存?
如果您使用普通数组,事情会变得简单一些:
int (*funcs[])(int, int) = {
comp_int,
comp_int_abs,
comp_int_length,
comp_int_digits_sum,
};
如果您想使用动态分配,则需要注意一些事项。
int (**funcs)(int, int) = malloc(4 * sizeof *funcs);
首先,我们需要分配适量的内存。通过乘以解引用指针的大小,我们不必担心动态数组的元素类型。(但是如果我们想手动编写类型,它会是sizeof (int (*)(int, int))
,而不是sizeof (int)
像您的代码中那样;我们数组的元素是指向函数的指针,而不是整数。)
然后我们检查分配失败:
if (!funcs) {
注意:我们检查指针本身 ( funcs
),而不是像您的代码 ( *funcs
)中的动态数组的第一个元素(可能不存在!)。如果malloc
失败并返回NULL
,!*funcs
则将尝试取消引用空指针,这很可能会使您的程序崩溃。
fprintf(stderr, "Failed to allocate memory\n");
错误信息转到stderr
,而不是stdout
。行以 结束'\n'
。
return 8;
}
由于我们这里没有真正的数组,我们不能使用初始化语法。特别是,= {
在赋值表达式中无效。
最直接的解决方案是手动分配元素:
funcs[0] = comp_int;
funcs[1] = comp_int_abs;
funcs[2] = comp_int_length;
funcs[3] = comp_int_digits_sum;
这有点容易出错,因为我们必须手动指定每个索引。但是,我们可以将其与上面的“普通数组”代码结合起来:
int (*const funcs_init[])(int, int) = {
comp_int,
comp_int_abs,
comp_int_length,
comp_int_digits_sum,
};
int (**funcs)(int, int) = malloc(sizeof funcs_init);
if (!funcs) { ... }
memcpy(funcs, funcs_init, sizeof funcs_init);
我们只是像往常一样初始化我们的数组(这里称为funcs_init
),然后使用 将内容复制到我们动态分配的内存中memcpy
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句