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

Jon*_*ing 44 c pointers function

我有一个如下结构,带有一个指向名为"length"的函数的指针,该函数将返回chars成员的长度.

typedef struct pstring_t {
    char * chars;
    int (* length)();
} PString;
Run Code Online (Sandbox Code Playgroud)

我有一个函数来返回从指针到PString的字符长度:

int length(PString * self) {
    return strlen(self->chars);
}
Run Code Online (Sandbox Code Playgroud)

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

PString * initializeString() {
    PString *str;
    str->length = &length;
    return str;
}
Run Code Online (Sandbox Code Playgroud)

很明显,我在这里做了一些非常错误的指针,因为该str->length = &length行在我的调试器中会产生一个EXC_BAD_ACCESS信号,就像返回strlen(self-> chars)一样.有没有人对这个问题有任何见解?

我特别希望能够让initializeString()函数返回指向PString的指针,并使用指向PString的指针作为输入的长度函数.这只是在C中实现基本的面向对象系统的一个实验,但我没有很多经验处理指针的经验.感谢你给与我的帮助.

ada*_*ost 62

分配内存以保持字符.

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

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 没有必要在C中强制转换`malloc`的返回值.另外,在分配之后应该初始化`str-> chars`(即`str-> chars [0] ='\ 0';`). (13认同)
  • 函数指针`int(*length)()`是否需要/不需要识别`PString*`参数? (3认同)
  • @ephemera 说的有道理。您必须使用该函数的完整原型。我尝试未在 PString 结构中指定函数的参数,但出现错误。如果我写 **int (* length)(PString *self);**,它工作正常。 (3认同)
  • 很好的答案!问题:我需要调用 free(p),但我还需要释放字符吗? (2认同)

jtb*_*des 6

我猜你的部分问题是参数列表不匹配.

int (* length)();
Run Code Online (Sandbox Code Playgroud)

int length(PString * self)
Run Code Online (Sandbox Code Playgroud)

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

......哇,这是乔恩!

编辑:并且,如下所述,您的结构指针永远不会设置为指向任何东西.你这样做的方式只有在你声明一个普通的结构而不是一个指针时才有效.

str = (PString *)malloc(sizeof(PString));
Run Code Online (Sandbox Code Playgroud)


EdH*_*EdH 6

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

PString * initializeString() {
    PString *str;
    str = (PString *) malloc(sizeof(PString));
    str->length = &length;
    return str;
}
Run Code Online (Sandbox Code Playgroud)

  • 请停止投射`malloc`。不需要在 C 中这样做。 (2认同)