C 指针数组-内存分配

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

我不熟悉指针数组(将函数放入数组)并使用malloc为其分配内存。你能帮我处理这段代码吗?具有以下功能:
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);