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

kqqjbcuj  于 2023-06-21  发布在  其他
关注(0)|答案(5)|浏览(129)

我有一个如下的结构体,其中有一个指向一个名为“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的指针,并让length函数使用指向PString的指针作为输入。这只是用C实现基本的面向对象系统的一个实验,但我没有太多直接处理指针的经验。谢谢你能给予我的任何帮助。

w1e3prcc

w1e3prcc1#

分配内存以保存字符。

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

typedef struct PString {
        char *chars;
        int (*length)(struct PString *self);
} 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->chars[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;
}
gopyfrb3

gopyfrb32#

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

int (* length)();

和/或

int length(PString * self)

是不一样的应该是int (* length)(PString *);
是乔恩

编辑:并且,如下所述,您的结构体指针永远不会被设置为指向任何对象。只有当你声明的是一个普通的结构体,而不是指针时,你这样做才有效。

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

waxmsbnn3#

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

PString * initializeString() {
    PString *str;
    str = (PString *) malloc(sizeof(PString));
    str->length = &length;
    return str;
}
ukdjmx9f

ukdjmx9f4#

指针str永远不会被分配。在使用前应该是malloc 'd。

ego6inou

ego6inou5#

你也可以使用“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

相关问题