分配具有函数指针作为字段的结构

时间:2020-10-27 17:07:38

标签: c linux struct dynamic-memory-allocation

我试图在C中分配一个以函数指针作为字段的结构,但是,对于以下代码,valgrind抛出错误“大小为8的无效写入”。但是,将int n=1更改为int n=10时,代码不会产生错误(当分配方式多于必要的内存时不会产生错误)。

#include <stdio.h>
#include <stdlib.h>

struct list {
    int (*one)(int,int);
    int (*two)(int,int);
};

int one0(int x,int y){return x+y;}
int two0(int x,int y){return x-y;}

void assignFunctions(struct list * l){
    l->one = one0;
    l->two = two0;
}

int main(){
    int n = 1;
    struct list * l = calloc(n, sizeof(struct list *));
    assignFunctions(l);
    free(l);
    return 0;
}

这里可能是什么问题?编译: gcc -O0 -g a.c && valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./a.out 请记住,这不是真实的代码,它是我必须处理的代码的简化。此外,无法更改assignFunction(struct list *l)struct list {}的代码。因此,我真正的问题是如何分配此结构?

1 个答案:

答案 0 :(得分:1)

您已经为struct list *分配了内存。但是,真正想要的是为struct list分配内存。这就是Valgrind抱怨的。由于尚未分配足够的资源并没有分配给成员指针,因此结果为undefined behaviour

struct list *l = calloc(n, sizeof(struct list));

或者更好:

struct list *l = calloc(n, sizeof *l);

应该解决您的问题。