我目前正在探索c中函数指针的方向,我模拟了一个我认为应该可以工作的小例子,但它反而产生了一个分段错误,我不太确定原因.

以下是我模拟的代码

void *new_testarr()
{
    void *testarr = malloc(4*sizeof(int));
    return testarr;
}

void *test_wrap(void *(*functionpointer)(void))
{
    return (*functionpointer);
}

int main(int argc, char const *argv[])
{
    int *arr = (int *) test_wrap(new_testarr);

    arr[0] = 1;
    arr[1] = 2;
    arr[2] = 3;
    arr[3] = 4;

    for (int i = 0; i < 4; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    free(arr);
    return 0;
}

我自己测试了函数new_testarr(),没有问题,但只要我试图包装它,就会发生分段错误.在将函数传递到TEST_WRAP()中时,我也try 添加一个与号,但也发生了同样的事情.

任何指导意见都将不胜感激.

推荐答案

return (*functionpointer);采用函数指针并将其作为void*返回,这是不允许的.我想你的意思是写return (*functionpointer)();--通过它的指针调用函数.

C++相关问答推荐

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

malloc实现:判断正确的分配对齐

为什么在4.9.37版的内核中,kfio还需要smp_wmb呢?

模拟shell并运行.sh文件

如何在C中引发/处理自定义信号?

N的值设置为0或1(未定义的行为),而我正在try 学习realloc和Malloc的用法

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

如何使解释器存储变量

==284==错误:AddressSaniizer:堆栈缓冲区下溢

在C中访问数组中的特定值

使用%f格式说明符打印整数值

Linux分段故障(核心转储)

如何逐位读取二进制文件?

向左移位3如何得到以字节为单位的位数?

当我在34mb的.mp4文件中使用FREAD时,我得到了一个分段错误,我如何解决它?

如何打印循环调度问题的时间表

C中2个数字的加法 - 简单的人类方法

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

使用邻接表创建图