source

C 구조의 멤버로서의 함수 포인터

goodcode 2022. 8. 30. 22:13
반응형

C 구조의 멤버로서의 함수 포인터

chars 멤버의 길이를 반환하는 "length"라는 함수에 대한 포인터가 있는 구조는 다음과 같습니다.

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

포인터에서 PString으로 문자 길이를 반환하는 기능이 있습니다.

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

PString에 포인터를 반환하는 initializeString() 함수가 있습니다.

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

내가 여기서 내 조언에 대해 뭔가 매우 잘못된 것을 하고 있는 것은 분명하다. 왜냐하면str->length = &length선이 EXC_B의 원인이 됩니다.디버거의 AD_ACCESS 신호와 'return strlen(self->chars)'이 같은 신호를 보냅니다.이 문제에 대해 아는 사람 있나요?

특히 initializeString() 함수는 PString에 포인터를 반환하고 길이 함수는 PString에 포인터를 입력으로 사용할 수 있도록 하고 싶습니다.이것은 C에서 기본적인 객체 지향 시스템을 구현하기 위한 실험일 뿐이지만, 저는 포인터를 정면으로 다루어 본 경험이 많지 않습니다.도와주셔서 감사합니다.

메모리를 할당하여 문자를 유지합니다.

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

뭔가 부족한 것 같습니다만, 액세스 하기 전에 PString에 메모리를 할당한 적이 있습니까?

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

파라미터 리스트가 일치하지 않는 것이 문제인 것 같습니다.

int (* length)();

그리고.

int length(PString * self)

같지 않다.그럴 것 같네요.int (* length)(PString *);.

와, 존이다!

Edit(편집): 그리고 아래에 설명된 바와 같이 구조 포인터는 어떤 것도 가리키도록 설정되지 않습니다.포인터가 아닌 일반 구조를 선언할 때만 작동됩니다.

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

포인터str는 할당되지 않습니다.그럴 것 같네요.malloc사용 전 d.

「void*」(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

언급URL : https://stackoverflow.com/questions/1350376/function-pointer-as-a-member-of-a-c-struct

반응형