구조체의 중첩 된 요소에 액세스하기 위해 구조체 오프셋을 사용하고 싶었지만 다음 테스트 프로그램이 문자열을 올바르게 복사하지 않습니다. 이 스 니펫을 어떻게 고칠 수 있습니까 (충돌). 중첩 된 구조체로 건너 뛰지 않는 것 같습니다.
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <string.h>
typedef struct {
char a;
int b;
char c[10];
char d[10];
}foo_t;
typedef struct {
foo_t foo;
}super_foo_t;
super_foo_t test;
int main() {
memcpy(&(test.foo) + offsetof(foo_t, c), "hello", sizeof("hello"));
printf("c should be hello:%s\n", test.foo.c);
return 0;
}
"foo_t"포인터를 오프셋하고 있으므로 "& test.foo"가 "foo_t *"유형이므로 & test.foo [offsetof (foo_t, c)]와 동일합니다.
컴파일러에게 오프셋이 아래와 같이 특별히 바이트 단위임을 알려야합니다.
memcpy((char*)(&(test.foo)) + offsetof(foo_t, c), "hello", sizeof("hello"));
오프셋은 바이트 단위로 오프셋을 제공하므로 바이트 오프셋을 사용하여 계산해야합니다. 따라서 멤버 "b"에 액세스하려면 다음과 같이 작성해야합니다.
int * ptrB = (int*) ((char*)(&(test.foo)) + offsetof(foo_t, b));
*ptrB = 15;
아래에서 수행하는 작업은 먼저 포인터를 바이트로 변환하여 컴파일러가 오프셋을 바이트로 계산 한 다음 원래 포인터 유형으로 돌아갈 수 있다는 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다