c语言结构体成员为函数指针,作为C结构的成员的函数指针

作为C结构的成员的函数指针

我有一个结构如下,带有指向“ length”的函数的指针,该函数将返回chars成员的长度。

typedef struct pstring_t {

char * chars;

int (* length)();

} PString;

我有一个函数可以将字符长度从指针返回到PString:

int length(PString * self) {

return strlen(self->chars);

}

我有一个函数initializeString()返回一个指向PString的指针:

PString * initializeString() {

PString *str;

str->length = &length;

return str;

}

很明显,我的指针在这里做错了很多,因为str->length = &length这行代码在我的调试器中引起了EXC_BAD_ACCESS信号,就像return strlen(self-> chars)一样。 有人对这个问题有见识吗?

我特别希望能够有initializeString()函数返回指向PString的指针,以及使函数使用指向PString的指针作为输入的length函数。 这只是在C语言中实现基本的面向对象系统的实验,但是我没有很多直接处理指针的经验。 感谢你给与我的帮助。

5个解决方案

60 votes

分配内存以容纳字符。

#include

#include

typedef struct PString {

char *chars;

int (*length)();

} PString;

int length(PString *self) {

return strlen(self->chars);

}

PString *initializeString(int n) {

PString *str = malloc(sizeof(PString));

str->chars = malloc(sizeof(char) * n);

str->length = length;

str[0] = '\0'; //add a null terminator in case the string is used before any other initialization.

return str;

}

int main() {

PString *p = initializeString(30);

strcpy(p->chars, "Hello");

printf("\n%d", p->length(p));

return 0;

}

adatapost answered 2020-07-24T02:20:26Z

6 votes

我的猜测是问题的一部分在于参数列表不匹配。

int (* length)();

int length(PString * self)

不一样。 它应该是int (* length)(PString *);。

哦,是乔恩!

编辑:并且,如下所述,您的结构指针永远不会设置为指向任何东西。 只有在声明普通结构而不是指针的情况下,您的操作方式才有效。

str = (PString *)malloc(sizeof(PString));

jtbandes answered 2020-07-24T02:21:03Z

4 votes

指针str从未分配。 使用前应为malloc。

jgottula answered 2020-07-24T02:21:23Z

4 votes

也许我在这里丢失了一些东西,但是在访问它之前您是否为该PString分配了内存?

PString * initializeString() {

PString *str;

str = (PString *) malloc(sizeof(PString));

str->length = &length;

return str;

}

EdH answered 2020-07-24T02:21:43Z

0 votes

您也可以使用“ void *”(void指针)将地址发送给函数。

typedef struct pstring_t {

char * chars;

int(*length)(void*);

} PString;

int length(void* self) {

return strlen(((PString*)self)->chars);

}

PString initializeString() {

PString str;

str.length = &length;

return str;

}

int main()

{

PString p = initializeString();

p.chars = "Hello";

printf("Length: %i\n", p.length(&p));

return 0;

}

输出:

Length: 5

ontech7 answered 2020-07-24T02:22:07Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值