我正在尝试探索面向对象编程,但我是一个C n00b,我想挑选出stackoverflow的聪明大脑:)
我的代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct speaker {
void (*say)(char *msg);
} speaker;
void say(char *dest) {
printf("%s",dest);
}
speaker* NewSpeaker() {
speaker *s;
s->say = say;
return s;
}
int main() {
speaker *s = NewSpeaker();
s->say("works");
}
然而,我从中得到了一个segfault,如果我移除say中的所有参数并使其无效,我可以让它正常工作我现在的代码怎么了?
也。虽然这在C中实现了一种形式的对象,但我正试图通过继承,甚至重写/重载方法来进一步实现它你认为我怎样才能做到这一点?
谢谢您!
最佳答案
在代码中,NewSpeaker()
实际上不会创建“新”扬声器。您需要使用内存分配功能,如malloc
或calloc
。
speaker* NewSpeaker() {
speaker *s = malloc(sizeof(speaker));
s->say = say;
return s;
}
例如,在不指定值的情况下,
malloc
,s
的返回值被初始化为堆栈上的垃圾,因此是segfault。