C 指针数组-内存分配
我不熟悉指针数组(将函数放入数组)并使用malloc为其分配内存。你能帮我处理这段代码吗?具有以下功能:C 指针数组-内存分配,c,arrays,pointers,malloc,C,Arrays,Pointers,Malloc,我不熟悉指针数组(将函数放入数组)并使用malloc为其分配内存。你能帮我处理这段代码吗?具有以下功能:int comp_int(int a,int b);综合资产负债表(综合资产负债表a、综合资产负债表b);整数合成整数长度(整数a,整数b);整数比较整数位数和(整数a,整数b) 并希望在指针数组中放置指向这些函数的指针。首先,我们希望为数组动态分配内存,并将函数的指针放入其中。被困在这个地方,我做错了什么 int (**funcs)(int, int) = malloc(4*sizeof(i
int comp_int(int a,int b);综合资产负债表(综合资产负债表a、综合资产负债表b);整数合成整数长度(整数a,整数b);整数比较整数位数和(整数a,整数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)=malloc(4*sizeof(int));
到
改变
*funcs={add_int, sub_int, div_int, mul_int};
到
带大括号的符号{}只能在初始化时使用,不能用于赋值。如果使用数组而不是指针,则可以执行以下操作:
int (*funcs[4])(int, int)={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\u init
),然后使用memcpy
将内容复制到我们动态分配的内存中。感谢您的复杂解释!这是为了学习目的,我要做的任务是动态分配内存。我知道,如果没有这种方法,事情会更简单。关于malloc
计算,您几乎应该始终使用使用形式something=malloc(NumberOfThings*sizeof*something)
。这样,无论某个东西是指向函数的指针还是指向结构的指针,它总是指向something
所指向的任何东西的大小。因此它总是正确的大小。因此int(**funcs)(int,int)=malloc(4*sizeof*funcs);
是正确的。@EricPostChil谢谢,我不知道;)
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);