I have a struct as follows, with a pointer to a function called \"length\" that will return the length of the chars member.
typedef struct pstring_t {
ch
You can use also "void*" (void pointer) to send an address to the function.
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;
}
Output:
Length: 5
My guess is that part of your problem is the parameter lists not matching.
int (* length)();
and
int length(PString * self)
are not the same. It should be int (* length)(PString *);
.
...woah, it's Jon!
Edit: and, as mentioned below, your struct pointer is never set to point to anything. The way you're doing it would only work if you were declaring a plain struct, not a pointer.
str = (PString *)malloc(sizeof(PString));
The pointer str
is never allocated. It should be malloc
'd before use.
Allocate memory to hold chars.
#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;
}
Maybe I am missing something here, but did you allocate any memory for that PString before you accessed it?
PString * initializeString() {
PString *str;
str = (PString *) malloc(sizeof(PString));
str->length = &length;
return str;
}