我有一个如下的 struct ,带有一个指向函数"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;
}

It is clear that I am doing something very wrong with my pointers here, because the str->length = &length line causes an EXC_BAD_ACCESS signal in my debugger, as does `return strlen(self->chars). Does anyone have any insights into this problem?

我特别希望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++相关问答推荐

如何确保内存分配在地址附近?

与unions 的未定义行为

ATmega328P USART发送字符重复打印

在使用GTK 4 Columnview列表模型时,如何为多列添加排序函数.C编码,Linux/GNOME环境

正在try 将文件/文件夹名从目录 struct 存储到链接列表

使用scanf在C中读取和存储文件中的值

tick.q中的Kdb+键控表语法

在C中访问数组中的特定值

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

运行时错误:在索引数组时加载类型为';char';`的空指针

不确定如何处理此编译错误

具有正确标头的C struct 定义问题

传递给函数的 struct 中的数组

可以';t从A9G模块拨打电话

为什么GCC不能在 struct 初始值设定项中以sizeof作为条件的三进制中处理复合文字的编译时求值?

共享内存未授予父进程权限

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

C struct 中的冒泡排序

变量的指针右对齐,函数的指针左对齐

如何转义包含指令中的字符?