作为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