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)
我猜你的部分问题是参数列表不匹配.
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)
也许我在这里遗漏了一些东西,但是您在访问它之前是否为该 PString 分配了任何内存?
PString * initializeString() {
PString *str;
str = (PString *) malloc(sizeof(PString));
str->length = &length;
return str;
}
Run Code Online (Sandbox Code Playgroud)