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