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

标签 c function pointers

我有一个结构如下,带有一个指向名为“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->字符)。有没有人对这个问题有任何见解?

我特别希望能够让 initializeString() 函数返回指向 PString 的指针,并让 length 函数使用指向 PString 的指针作为输入。这只是一个用 C 实现基本的面向对象系统的实验,但我没有太多正面处理指针的经验。感谢您能给我的任何帮助。

最佳答案

分配内存来保存字符。

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

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

关于c - 作为 C 结构成员的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1350376/

相关文章:

c - 我是否正确地使用 cURL 模拟 CORS?我是否需要实现 OPTIONS 请求

c++ - 未实现的 Tesseract 函数

c - 数组指针数组上的指针

c++ - 将 unsigned short* 转换为 int*

c++ - bitwise not操作的编译器优化

c++ - 从 GLU Tesselator 接收 GLU_TESS_ERROR_5

MySQL C pdb 文件

MySql 函数没有返回正确的结果

php - 展平多维数组的函数无法按预期工作

c - 具有指向指针和 strcpy 的指针的函数