【问题标题】:Array of pointers - memory allocation指针数组 - 内存分配
【发布时间】:2019-06-01 18:58:09
【问题描述】:

我是指针数组的新手(将函数放入数组)并使用 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};

【问题讨论】:

  • 关于malloc 的计算,您应该几乎总是使用something = malloc(NumberOfThings * sizeof *something) 的形式。这样,无论是指向函数的指针还是指向结构的指针,sizeof *something 始终是 something 指向的大小。所以它总是合适的尺寸。所以int (**funcs)(int, int) = malloc(4 * sizeof *funcs); 是对的。
  • @EricPostpischil 谢谢,不知道 ;)

标签: c arrays pointers malloc


【解决方案1】:

首先,为什么要分配动态内存?

如果你使用普通数组,事情会变得简单一些:

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将内容复制到我们动态分配的内存中。

【讨论】:

  • 感谢您的复杂解释!这是出于学习目的,我要做的任务是动态分配内存。我知道,如果没有这种方式,事情会更简单。
【解决方案2】:

首先,将分配从:

int (**funcs)(int, int)=malloc(4*sizeof(int));

到

int (**funcs)(int, int)=malloc(4*sizeof(*funcs));

改变

*funcs={add_int, sub_int, div_int, mul_int};

到

funcs[0]=add_int;
funcs[1]=sub_int;
funcs[2]=div_int;
funcs[3]=mul_int;

带大括号的符号 {} 只能用于初始化,不能用于赋值。如果你使用数组而不是指针,你可以这样做:

int (*funcs[4])(int, int)={add_int, sub_int, div_int, mul_int};

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 2015-12-10
    • 1970-01-01
    • 2012-07-10
    • 2013-10-04
    • 1970-01-01
    • 2021-06-22
    • 2015-04-21
    • 2012-03-15
    相关资源
    最近更新 更多