我试图在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 {}
的代码。因此,我真正的问题是如何分配此结构?
答案 0 :(得分:1)
您已经为struct list *
分配了内存。但是,真正想要的是为struct list
分配内存。这就是Valgrind抱怨的。由于尚未分配足够的资源并没有分配给成员指针,因此结果为undefined behaviour。
struct list *l = calloc(n, sizeof(struct list));
或者更好:
struct list *l = calloc(n, sizeof *l);
应该解决您的问题。