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
'source' 카테고리의 다른 글
Java에서 Camel Case를 사람이 읽을 수 있는 이름으로 변환하려면 어떻게 해야 합니까? (0) | 2022.08.30 |
---|---|
strlcpy와 strlcat은 왜 안전하지 않다고 생각됩니까? (0) | 2022.08.30 |
Vue.js에서 v-for를 사용하여 개체의 어레이에 있는 항목에 액세스합니다. (0) | 2022.08.30 |
파일 범위에서 가변적으로 변경된 어레이 (0) | 2022.08.30 |
Vuex Store에서 'this'로 액세스 상태 (0) | 2022.08.30 |