我正在尝试探索面向对象编程,但我是一个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()实际上不会创建“新”扬声器。您需要使用内存分配功能,如malloccalloc

speaker* NewSpeaker() {
   speaker *s = malloc(sizeof(speaker));
   s->say = say;
   return s;
}

例如,在不指定值的情况下,mallocs的返回值被初始化为堆栈上的垃圾,因此是segfault。

09-18 10:05