我有一个如下结构,带有一个指向名为“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信号,就像`返回strlen(self-> chars)一样。有没有人对此问题有任何见解?
我特别希望能够让initializeString()函数返回指向PString的指针,并使用指向PString的指针作为输入的长度函数。这只是在C中实现基本的面向对象系统的一个实验,但我没有很多经验处理指针的经验。谢谢你能给我的任何帮助。
答案 0 :(得分:58)
分配内存以保存字符。
#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;
}
答案 1 :(得分:6)
我猜你的部分问题是参数列表不匹配。
int (* length)();
和
int length(PString * self)
不一样。它应该是int (* length)(PString *);
。
......哇,这是乔恩!
编辑:并且,如下所述,您的结构指针永远不会设置为指向任何内容。你正在做的方式只有在你声明一个普通的结构而不是一个指针时才会起作用。
str = (PString *)malloc(sizeof(PString));
答案 2 :(得分:4)
永远不会分配指针str
。使用前应为malloc
。
答案 3 :(得分:4)
也许我在这里遗漏了一些东西,但你在访问它之前是否为该PString分配了任何内存?
PString * initializeString() {
PString *str;
str = (PString *) malloc(sizeof(PString));
str->length = &length;
return str;
}
答案 4 :(得分:0)
您也可以使用&#34; void *&#34; (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