utilice una sintaxis punteros puntero para miembro imprimir funciones funcion estándar estructuras estructura datos crear con como c function pointers

una - punteros c++



Puntero de función como miembro de una estructura C (5)

Tengo una estructura de la siguiente manera, con un puntero a una función llamada "longitud" que devolverá la longitud del miembro de caracteres.

typedef struct pstring_t { char * chars; int (* length)(); } PString;

Tengo una función para devolver la longitud de los caracteres de un puntero a una PString:

int length(PString * self) { return strlen(self->chars); }

Tengo una función initializeString () que devuelve un puntero a una PString:

PString * initializeString() { PString *str; str->length = &length; return str; }

Está claro que estoy haciendo algo muy mal con mis punteros aquí, porque la línea str->length = &length causa una señal EXC_BAD_ACCESS en mi depurador, al igual que `return strlen (self-> chars). ¿Alguien tiene alguna idea sobre este problema?

Específicamente, quiero poder hacer que la función initializeString () devuelva un puntero a una PString, y la función de longitud para usar un puntero a una PString como entrada. Esto es solo un experimento en la implementación de un sistema rudimentario orientado a objetos en C, pero no tengo mucha experiencia lidiando con punteros de frente. Gracias por cualquier ayuda que me puedan dar.


Asignar memoria para mantener los caracteres.

#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; }


El puntero str nunca se asigna. Debe ser malloc antes de su uso.


Supongo que parte de tu problema es que las listas de parámetros no coinciden.

int (* length)();

y

int length(PString * self)

no son lo mismo. Debe ser int (* length)(PString *); .

... woah, es Jon!

Editar : y, como se menciona a continuación, su puntero de estructura nunca se establece para que apunte a nada. La forma en que lo hagas solo funcionaría si estuvieras declarando una estructura simple, no un puntero.

str = (PString *)malloc(sizeof(PString));


Tal vez me esté perdiendo algo aquí, ¿pero asignó algún tipo de memoria para esa PString antes de acceder a ella?

PString * initializeString() { PString *str; str = (PString *) malloc(sizeof(PString)); str->length = &length; return str; }


También puede usar "void *" (puntero void) para enviar una dirección a la función.

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; }

Salida:

Length: 5