c - 指针数组 - 内存分配

标签 c arrays pointers malloc

我是指针数组(将函数放入数组)并使用 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 将内容复制到动态分配的内存中。 .

关于c - 指针数组 - 内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56409590/

相关文章:

c - 重新分配一个数组但不要丢失其中的元素

c - poll() 在第一次调用后停止设置 POLLIN

c - 在动态规划中使用位掩码

C 编程命令行参数

c - 在 c 中将 const 与指针一起使用

C++ 指针。我想知道逻辑

c - 二维零数组中的随机一

循环队列实现

Javascript 从数组中删除重复的对象

java - 如何使我的二维数组在java中水平和垂直显示?